활성 창 AHK 스크립트 주변의 빨간색 테두리를 미세 조정하세요.

활성 창 AHK 스크립트 주변의 빨간색 테두리를 미세 조정하세요.

저는 오토핫키 초보자이지만 활성 창 주위에 빨간색 테두리를 추가하여 더 눈에 띄게 만드는 유용한 스크립트를 발견했습니다. autohotkey를 설치하고 스크립트를 실행했지만 두 가지 문제가 있습니다.

  1. 최대화되거나 창이 한쪽으로 맞춰지면 작동하지 않습니다.
  2. 국경도 안맞아

문제를 보여주는 사진을 첨부했습니다.문제를 보여주는 그림

누군가 이 스크립트를 도와주고 수정하거나 수정 방법에 대한 자세한 지침을 제공할 수 있다면 감사하겠습니다.

#Persistent

SetTimer, DrawRect, 50
border_thickness = 10
border_color = FF0000

DrawRect:
WinGetPos, x, y, w, h, A
if (x="")
    return
Gui, +Lastfound +AlwaysOnTop +Toolwindow
iw:= w+4
ih:= h + 4
w:=w+ 8
h:=h + 8
x:= x - border_thickness
y:= y - border_thickness
Gui, Color, FF0000
Gui, -Caption
WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% 0-0 %border_thickness%-%border_thickness% %iw%-%border_thickness% %iw%-%ih% %border_thickness%-%ih% %border_thickness%-%border_thickness%
Gui, Show, w%w% h%h% x%x% y%y% NoActivate, Table awaiting Action
return

답변1

이해하기 쉽도록 변수 이름을 바꾸는 것이 좋습니다. 명령문 WinSet은 x/y 좌표 쌍으로 두 개의 상자를 그리므로 x/y 좌표 쌍으로 변수 이름을 지정하고 명령문 앞에 할당하는 것이 WinSet덜 혼란스럽습니다.

이 특정 예에서는 창 외부 주위에 테두리도 그립니다. 창 바깥쪽이 화면 가장자리에 있을 때 테두리는 화면 밖에 있으므로 보이지 않습니다. 테두리가 화면 가장자리에 있을 때(또는 바깥쪽에 있을 때) 화면에 그리려면 창 경계 내부(또는 부분적으로 내부)에 테두리를 그리는 것이 아니라 창 경계 외부에 테두리를 그려야 합니다. .

이는 부분적인 해결책일 뿐입니다. 왜냐하면 최대화된 상태에서는 창이 단순히 가장자리에 있는 것보다 화면에서 훨씬 더 멀리 떨어져 있기 때문입니다. 이 경우 최대화된 조건을 감지하고 특정 수의 픽셀만큼 일반적인 것보다 훨씬 더 경계를 오프셋해야 합니다.

변수 이름을 바꾸고 코드를 수정하여 예제를 제공했습니다. 효과를 확인하기 위해 다양한 '테두리 유형'을 변경할 수 있습니다. 다르게 그리려면 나머지는 단지 수학일 뿐입니다.

#Persistent

SetTimer, DrawRect, 50
border_thickness = 5
border_color = FF0000

DrawRect:
WinGetPos, x, y, w, h, A
if (x="")
    return
Gui, +Lastfound +AlwaysOnTop +Toolwindow

borderType:="inside"                ; set to inside, outside, or both

if (borderType="outside") { 
    outerX:=0
    outerY:=0
    outerX2:=w+2*border_thickness
    outerY2:=h+2*border_thickness

    innerX:=border_thickness
    innerY:=border_thickness
    innerX2:=border_thickness+w
    innerY2:=border_thickness+h

    newX:=x-border_thickness
    newY:=y-border_thickness
    newW:=w+2*border_thickness
    newH:=h+2*border_thickness

} else if (borderType="inside") {   
    WinGet, myState, MinMax, A
    if (myState=1)
        offset:=8
    else 
        offset:=0

    outerX:=offset
    outerY:=offset
    outerX2:=w-offset
    outerY2:=h-offset

    innerX:=border_thickness+offset
    innerY:=border_thickness+offset
    innerX2:=w-border_thickness-offset
    innerY2:=h-border_thickness-offset

    newX:=x
    newY:=y
    newW:=w
    newH:=h



} else if (borderType="both") { 
    outerX:=0
    outerY:=0
    outerX2:=w+2*border_thickness
    outerY2:=h+2*border_thickness

    innerX:=border_thickness*2
    innerY:=border_thickness*2
    innerX2:=w
    innerY2:=h

    newX:=x-border_thickness
    newY:=y-border_thickness
    newW:=w+4*border_thickness
    newH:=h+4*border_thickness
}



Gui, Color, %border_color%
Gui, -Caption

;WinSet, Region, 0-0 %w%-0 %w%-%h% 0-%h% 0-0 %border_thickness%-%border_thickness% %iw%-%border_thickness% %iw%-%ih% %border_thickness%-%ih% %border_thickness%-%border_thickness%
 WinSet, Region, %outerX%-%outerY% %outerX2%-%outerY% %outerX2%-%outerY2% %outerX%-%outerY2% %outerX%-%outerY%    %innerX%-%innerY% %innerX2%-%innerY% %innerX2%-%innerY2% %innerX%-%innerY2% %innerX%-%innerY% 


;Gui, Show, w%w% h%h% x%x% y%y% NoActivate, Table awaiting Action
Gui, Show, w%newW% h%newH% x%newX% y%newY% NoActivate, Table awaiting Action
return

또한 참고로, 창 이동 이벤트에 대해 Windows 콜백 이벤트를 연결하는 방법도 있으므로 항상 업데이트되는 50ms 타이머를 사용할 필요가 없습니다. 이 경우 창이 움직일 때만 업데이트되며 타이머에는 눈에 띄는 지연과 처리 오버헤드가 발생합니다. 그러나 타이머는 (이미 수행한 것처럼) 게이트 외부에서 구현하기 훨씬 쉬운 솔루션이며, 많은 경우 필요하지 않은 경우 창 이벤트를 연결하는 데 추가 복잡성을 감당할 가치가 없습니다. 그래도 가능하다는 점을 알려드립니다.

답변2

스크립트를 수정하는 대신 정확히 원하는 작업을 수행하는 이 코드를 사용하세요.

#Requires AutoHotkey 2.0+
#SingleInstance Force
SetTimer(DrawBorder,100)

DrawBorder(){
  Static OS:=3
  Static BG:="FF0000"
  Static myGui:=Gui("+AlwaysOnTop +ToolWindow -Caption","GUI4Border")
  myGui.BackColor:=BG
  WA:=WinActive("A")
  If WA && !WinGetMinMax(WA) && !WinActive("GUI4Border ahk_class AutoHotkeyGUI"){
    WinGetPos(&wX,&wY,&wW,&wH,WA)
    myGui.Show("x" wX " y" wY " w" wW " h" wH " NA")
    Try WinSetRegion("0-0 " wW "-0 " wW "-" wH " 0-" wH " 0-0 " OS "-" OS " " wW-OS
    . "-" OS " " wW-OS "-" wH-OS " " OS "-" wH-OS " " OS "-" OS,"GUI4Border")
  }Else{
    myGui.Hide()
    Return
  }
}

관련 정보