MouseGesture.ahkでウィンドウ操作メニュー表示してみた。
Windows7環境で古いmenuHackerがソフトを巻き込んで落ちるので困っていたのだが、よく考えたら独自コマンドの表示さえできればいいのだと気づき、MouseGesture.ahkでそれっぽいものを作ってみた。
mHの設定ファイルっぽいなにかを読み込むようにしたら、ちょっとばかり複雑化。詳しいことはスクリプト読んでもらうとして、簡単に説明すると「タイトルバーで右クリックすると、本物とは別に独自メニューも隅っこに表示される」というシロモノ。
まず"MG_User.ahk"の"初期化処理"セクションに以下を記述。
MenuId_Max := 0, ItemId := 0, HieLv := 0
MenuId_Cur := "WH" MenuId_Max
Loop,Read, WinHack.txt
{
dummy := RegExMatch(A_LoopReadLine, "^\s?([\[\]\;]|----)?\s?([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)\s*,?\s*([^,]*)", $)
if(";" == $1)
Continue
ItemId++
if("[" == $1) {
MenuId_HL%HieLv% := MenuId_Cur
MenuId_Max++
MenuId_Cur := "WH" MenuId_Max
%MenuId_Cur%_Text := $2
ItemId_HL%HieLv% := ItemId
ItemId := 0
HieLv++
Continue
}
if("]" == $1) {
HieLv--
MenuId_HLUpp := MenuId_HL%HieLv%
MenuId_Cur_Text := %MenuId_Cur%_Text
Menu, %MenuId_HLUpp%, Add, %MenuId_Cur_Text%, :%MenuId_Cur%
MenuId_Cur := MenuId_HLUpp
ItemId := ItemId_HL%HieLv%
Continue
}
WM_X%MenuId_Cur%_%ItemId% := $3
WM_Y%MenuId_Cur%_%ItemId% := $4
WM_W%MenuId_Cur%_%ItemId% := $5
WM_H%MenuId_Cur%_%ItemId% := $6
Menu, %MenuId_Cur%, Add, %$2%, WH_WM
}
Menu, WH0, Add
Menu, WH_WK, Add, 実行, WH_WK
Menu, WH_Etc, Add, 強制終了, :WH_WK
Menu, WH_Etc, Add, プログラムのフォルダを開く(&O), WH_AppDirOpen
Menu, WH_Etc, Add
Menu, WH_Etc, Add, WinHack.txtを開く, WH_SettingOpen
Menu, WH0, Add, その他, :WH_Etc
次に、同じく"MG_User.ahk"の"サブルーチン定義"セクションに以下を記述。
WH_Show:
Menu, WH0, Show, 0, 0
return
WH_WM:
WM_X := WM_X%A_ThisMenu%_%A_ThisMenuItemPos%
WM_Y := WM_Y%A_ThisMenu%_%A_ThisMenuItemPos%
WM_W := WM_W%A_ThisMenu%_%A_ThisMenuItemPos%
WM_H := WM_H%A_ThisMenu%_%A_ThisMenuItemPos%
WinMove, A, , %WM_X%, %WM_Y%, %WM_W%, %WM_H%
return
WH_WK:
WinKill, A
return
WH_AppDirOpen:
WinGet pid, PID, A
wmi := ComObjGet("winmgmts:")
queryEnum := wmi.ExecQuery(""
. "Select * from Win32_Process where ProcessId=" . pid)
._NewEnum()
if queryEnum[process] {
RegExMatch(process.CommandLine, """?([^""]+|[^\s]+)""?", $)
SplitPath, $1, , AppDir
Run, explore %AppDir%
}
wmi := queryEnum := process := ""
return
WH_SettingOpen:
Run, WinHack.txt
return
そして、"設定編集"から以下をインポート。ただ、これだと右クリックで独自メニュー表示、もう一度右クリックで本物表示なので、煩わしい人は適当に。
[TitleBar]
Custom=MG_HitTest()="Caption"
[RB__]
G=RB__
TitleBar=GoSub,WH_Show
最後に、MouseGesture.ahkと同じディレクトリに"WinHack.txt"を作り、設定を記述する。書式は以下の通り。
- "["と"]"でサブメニュー化。ネストも可。
- "メニュー項目名, X, Y, Width, Height"でウィンドウ移動・サイズ変更項目を作成可能。
- ";"で始まる行はコメント行。
- 上の書式に沿わない行(空改行も含む)はセパレータになる。
ああ、うん。設定ファイルでいじれるのはWinMoveだけですがなにか!? ――ここまでやったなら、ほかのコマンドにも対応すればよかったんだが、メニューのネストに対応したあたりで満足してしまった(ぐへー。
上の説明だけじゃよくわからんと思うので以下実例。
[移動 (&I)
基準座標に戻す (&W), 0, 0
タスクバーを避ける, 165, , ,
----
左656, 0, 0, 656 ,1050
右1024, 656, 0, 1024 ,1050
右1024, 656, 0, 1024 ,1050
----
左1024, 0, 0, 1024 ,1050
右656, 1024, 0, 656 ,1050
]
[リサイズ (&R)
850*635, , ,850 ,635
1130*850, , ,1130 ,850
----
; 800*600, , ,800 ,600
1024*768, , ,1024 ,768
1280*1024, , ,1280 ,1024
]
自分が実用してるやつなので、対応しときながらネスト使ってないっていうね……。
さて。ここまでやっといてなんだが。完成させて記事(これ)書こうと、mH公式を見に行ったら昨夏に64bit対応版が公開されていて、32bit環境でも安定しているっぽい!(ぎゃー。
というわけでAHKの自由度万歳な人以外はmH入れればいい!
B@r09u3 Style Op.2 -- menuHacker公式。
blechmusik2の日記>最前面のウィンドウのプロセスを取得し、そのアプリケーションのパスを抜き出すスクリプト -- 丸パク参考にした。
リリース直後に即更新。前回のは実はα版だったんだよ!!! Ω ΩΩ {後付け乙。 というわけで、ウィンドウ操作メニューを表示するMouseGesture2用スクリプトver.1.0.1。変更点メニュー呼び出しを「タイトルバー右側のボタンを右クリック」で行うように変更。操作対象をアクティブウィンドウではなく、右クリックしたウィンドウに変更。入れ忘れてた最前面固定を追加。 以下ソース。導入方法はソース内のコメント通りに。3工程あるので注意。; -------- --------- --------- -......more
.jpg)
