![微调活动窗口 AHK 脚本周围的红色边框](https://linux22.com/image/1525455/%E5%BE%AE%E8%B0%83%E6%B4%BB%E5%8A%A8%E7%AA%97%E5%8F%A3%20AHK%20%E8%84%9A%E6%9C%AC%E5%91%A8%E5%9B%B4%E7%9A%84%E7%BA%A2%E8%89%B2%E8%BE%B9%E6%A1%86.png)
我是 autohotkey 新手,但我发现这种有用的脚本可以在我的活动窗口周围添加红色边框,使其更加显眼。我已经安装了 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
此外,仅供参考,还有一些方法可以将窗口回调事件挂接到窗口移动事件,这样您就不必使用始终更新的 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
}
}