Я бы порекомендовал переименовать переменные, чтобы иметь смысл. Оператор 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, 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%
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 для событий перемещения окна, так что вам не нужно использовать таймер 50 мс, который постоянно обновляется. В этом случае он будет обновляться только тогда, когда окно перемещается, и таймер приходит с видимой задержкой и накладными расходами обработки. Но таймер является гораздо более простым решением для реализации вне шлюза (как вы уже сделали), и во многих случаях не стоит дополнительной сложности перехватывать события окна, если вам это не нужно. Просто сообщаю, что это возможно.