微调活动窗口 AHK 脚本周围的红色边框

微调活动窗口 AHK 脚本周围的红色边框

我是 autohotkey 新手,但我发现这种有用的脚本可以在我的活动窗口周围添加红色边框,使其更加显眼。我已经安装了 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

此外,仅供参考,还有一些方法可以将窗口回调事件挂接到窗口移动事件,这样您就不必使用始终更新的 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
  }
}

相关内容