![활성 창 AHK 스크립트 주변의 빨간색 테두리를 미세 조정하세요.](https://rvso.com/image/1525455/%ED%99%9C%EC%84%B1%20%EC%B0%BD%20AHK%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%20%EC%A3%BC%EB%B3%80%EC%9D%98%20%EB%B9%A8%EA%B0%84%EC%83%89%20%ED%85%8C%EB%91%90%EB%A6%AC%EB%A5%BC%20%EB%AF%B8%EC%84%B8%20%EC%A1%B0%EC%A0%95%ED%95%98%EC%84%B8%EC%9A%94..png)
저는 오토핫키 초보자이지만 활성 창 주위에 빨간색 테두리를 추가하여 더 눈에 띄게 만드는 유용한 스크립트를 발견했습니다. autohotkey를 설치하고 스크립트를 실행했지만 두 가지 문제가 있습니다.
- 최대화되거나 창이 한쪽으로 맞춰지면 작동하지 않습니다.
- 국경도 안맞아
누군가 이 스크립트를 도와주고 수정하거나 수정 방법에 대한 자세한 지침을 제공할 수 있다면 감사하겠습니다.
#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
}
}