「WinMania」や「Maximize Assistant」よりも細かな条件を指定したくて,軽く
AutoHotkey
スクリプトを書いてみることにした。
ライセンスは
NYSL。
¶ やりたいこと
今回はシンプルな目標で。
- 新しく開くエクスプローラーのウインドウ (フォルダーとか) のサイズを 800×600 に固定する。その後の移動やサイズ変更は許容する。
これは WinMania や Maximize Assistant でも実現可能。
- 最初に開く Google Chrome のウインドウの位置を (50, 50),サイズを 850×700 に固定する。その後の移動やサイズ変更は許容する。
ふたつ目以降に開く Google Chrome のウインドウには関与しない。
¶ 設計
新しいウインドウが作られたタイミングで動作する。
定期的な監視はしない。
エクスプローラーのウインドウは,クラスが "ExploreWClass" もしくは "CabinetWClass" に一致するものを制御対象とする。
タイトルはチェックしない。
Google Chrome のウインドウは,クラスが "Chrome_WindowImpl_0" に一致するもの。
ただし,ひとつ目のウインドウのみを制御対象とする。
¶ スクリプト
#SingleInstance
Gui +LastFound
hWnd := WinExist()
DllCall("RegisterShellHookWindow", UInt, hWnd)
msgNum := DllCall("RegisterWindowMessage", Str, "SHELLHOOK")
OnMessage(msgNum, "ShellMessage")
OnExit, CleanExit
return
CleanExit:
OnExit,
DllCall("DeregisterShellHookWindow", UInt, hWnd)
ExitApp
ShellMessage(wParam, lParam)
{
HSHELL_WINDOWCREATED = 1
if wParam = %HSHELL_WINDOWCREATED%
{
IfWinExist, ahk_id %lParam%
{
WinGetClass, class
WinGetTitle, title
; ToolTip %class%: %title%
if (class == "ExploreWClass"
|| class == "CabinetWClass")
{
WinGetPos, x, y
WinMove, , , x, y, 800, 600
}
else if (class == "Chrome_WindowImpl_0")
{
WinGet, windowCount, Count, ahk_class %class%
if windowCount = 1
{
WinMove, , , 50, 50, 850, 700
}
}
}
}
}
¶ 補足
新しいウインドウが作られたタイミングできちんと動作してるかどうかアヤシい場合は,ToolTip
コマンドの行のコメントアウトを解除した状態で実験するといい。
条件にタイトルを指定したい場合は,「RegExMatch(title, " - Google Chrome$") > 0」など。
¶ おまけ: 最適化? 難読化?
Perl ほどじゃないのだけれど,いろいろな書き方が出来るようだ。
#SingleInstance
Gui +LastFound
hWnd := WinExist()
DllCall("RegisterShellHookWindow", UInt, hWnd)
OnMessage(DllCall("RegisterWindowMessage", Str, "SHELLHOOK"), "ShellMessage")
OnExit, CleanExit
return
CleanExit:
OnExit,
DllCall("DeregisterShellHookWindow", UInt, hWnd)
ExitApp
ShellMessage(wParam, lParam)
{
IfNotEqual, wParam, 1, return ; HSHELL_WINDOWCREATED
IfWinNotExist, ahk_id %lParam%
return
WinGetClass, class
WinGetTitle, title
; ToolTip %class%: %title%
StringCaseSense, On
if class in ExploreWClass,CabinetWClass
{
WinGetPos, x, y
WinMove, , , x, y, 800, 600
return
}
if class = Chrome_WindowImpl_0
{
WinGet, windowCount, Count, ahk_class %class%
IfEqual, windowCount, 1, WinMove, , , 50, 50, 850, 700
return
}
}
思わずニヤけてしまった私キモい;;