![アクティブウィンドウの周りの赤い境界線を微調整するAHKスクリプト](https://rvso.com/image/1525455/%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%AE%E5%91%A8%E3%82%8A%E3%81%AE%E8%B5%A4%E3%81%84%E5%A2%83%E7%95%8C%E7%B7%9A%E3%82%92%E5%BE%AE%E8%AA%BF%E6%95%B4%E3%81%99%E3%82%8BAHK%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88.png)
私はオートホットキー初心者ですが、アクティブウィンドウの周囲に赤い枠線を付けて目立たせるための便利なスクリプトを見つけました。オートホットキーをインストールしてスクリプトを実行しましたが、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
}
}