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
  {
    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の日記>最前面のウィンドウのプロセスを取得し、そのアプリケーションのパスを抜き出すスクリプト -- 丸パク参考にした。


[PR]
by lordnoesis | 2012-01-09 19:00 | テクノロジ | Trackback(1) | Comments(0)
トラックバックURL : http://poimono.exblog.jp/tb/17297787
トラックバックする(会員専用) [ヘルプ]
※このブログはトラックバック承認制を適用しています。 ブログの持ち主が承認するまでトラックバックは表示されません。
Tracked from 名称未定っぽい。 at 2012-01-10 18:04
タイトル : MouseGesture.ahkでウィンドウ操作メニュー..
 リリース直後に即更新。前回のは実はα版だったんだよ!!! Ω ΩΩ {後付け乙。 というわけで、ウィンドウ操作メニューを表示するMouseGesture2用スクリプトver.1.0.1。変更点メニュー呼び出しを「タイトルバー右側のボタンを右クリック」で行うように変更。操作対象をアクティブウィンドウではなく、右クリックしたウィンドウに変更。入れ忘れてた最前面固定を追加。 以下ソース。導入方法はソース内のコメント通りに。3工程あるので注意。; -------- --------- --------- -...... more
名前
URL
画像認証
削除用パスワード

※このブログはコメント承認制を適用しています。ブログの持ち主が承認するまでコメントは表示されません。

ブログトップ | ファンになる