アクティブウィンドウの周りの赤い境界線を微調整するAHKスクリプト

アクティブウィンドウの周りの赤い境界線を微調整するAHKスクリプト

私はオートホットキー初心者ですが、アクティブウィンドウの周囲に赤い枠線を付けて目立たせるための便利なスクリプトを見つけました。オートホットキーをインストールしてスクリプトを実行しましたが、2 つの問題があります。

  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座標のペアで2つのボックスを描画するため、変数に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

また、参考までに、ウィンドウ移動イベントのウィンドウ コールバック イベントをフックする方法もあります。これにより、常に更新される 50 ミリ秒のタイマーを使用する必要がなくなります。その場合、ウィンドウが移動したときにのみ更新され、タイマーには目に見える遅延と処理オーバーヘッドが伴います。ただし、タイマーは、最初から実装するのがはるかに簡単なソリューションです (既に実行済み)。また、多くの場合、必要がない場合は、ウィンドウ イベントをフックするための余分な複雑さに見合う価値はありません。ただし、それが可能であることをお知らせします。

答え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
  }
}

関連情報