PostMessage/SendMessage関連

ウィンドウメッセージについて

WindowsのGUIは、システムやアプリケーションがウィンドウやGUIコントロールに対してウィンドウメッセージを送信し、ウィンドウを所有するアプリケーションが送られたメッセージに対応した動作を行うことで成り立っている。
AutoHotkeyでも、PostMessageやSendMessageのコマンドでウィンドウメッセージを送信することにより、ウィンドウに対して様々な操作を行うことができる。

ウィンドウメッセージや各メッセージの動作については、Web上に多くの資料がある。
一般的なメッセージの一覧については、WinAPI Database for VB Programmerのアルファベット順表示「W」の項などが詳しい。

WM_COMMANDのコマンド番号を調べる

「WM_COMMAND」メッセージを送ると、メニューなどのコマンドを実行させることができる。
WM_COMMANDを送るには、Msg引数に「0x111」を指定する。
wParam引数にはコマンドIDを指定する。

コマンドIDを調べる簡単な方法は、Resource Hackerを使う方法である。
調べたい実行ファイルを開き、ツリーの「Menu」以下を見ると、

MENUITEM "&File...   \tL",  40029

のような形式でメニュー項目が記述されている。
一番最後の数字が、メニュー項目に対応するコマンドIDである。

また、ツリーの「Accelerators」以下では、

VK_A, 40019, NOINVERT, CONTROL, VIRTKEY

のような行が列挙されている。
コマンド名が書かれていないのでわかりづらいが、ショートカットキーに対応するコマンドIDが調べられる。

これらの方法では、ツールバーにしか割り当てられていないコマンドIDを調べることは出来ない。
そこで、ツールバーボタンのコマンドIDを調べるスクリプトを作成した。
標準的なツールバーであれば、ボタン番号に対応するコマンドIDを調べることができるはずである。

Windows付属のペイントのツールボックスのような標準的で無いツールバーの場合、このスクリプトでもコマンドIDを調べられないが、窓コンなどのツールで実行されたコマンドを監視して調べられる場合もある。

DelphiやVisualBasicなど、一部の開発環境で作られたソフトの場合、コマンドIDが一定でなかったりして、コマンドIDを調べても役に立たない。