PostMessage / SendMessage

提供: AutoHotkey Wiki
移動: 案内検索

実行制御 | GUI表示 | 演算・変数 | メモリ・DLL操作 | 文字列操作 | キーボード | マウス | シェル | ウィンドウ | ウィンドウグループ
ステータスバー | コントロール | サウンド | ファイル | INIファイル | レジストリ | 環境変数 | AutoHotkey | その他 | 設定関係 | オブジェクト

PostMessage / SendMessage[編集]

ウィンドウやGUIコントロールにウィンドウメッセージを送信する。(SendMessageは応答を待って結果を取得できる)

PostMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]
SendMessage, Msg [, wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText]

Parameters[編集]

引数名 説明
Msg 一般的なメッセージの一覧については、ウィンドウメッセージ一覧で検索 すると解説しているサイトが多数見つかる。
数値の指定には を用いることが可能。
wParam メッセージの第1引数。省略時は 0となる。
数値の指定には を用いることが可能。
lParam メッセージの第2引数。省略時は 0となる。
数値の指定には を用いることが可能。
Control 省略もしくは空白のときは、ウィンドウに直接メッセージが送られる。
それ以外の指定方法はウィンドウ指定の方法参照。
WinTitle ウィンドウ指定の方法参照。
WinText
ExcludeTitle
ExcludeText

ErrorLevel[編集]

AHKL [v1.1.04+] このコマンドは失敗した場合に例外をスローすることができる。詳細は実行時エラーを参照。

PostMessage[編集]

成功すれば 0、ウィンドウが見つからないなどの問題が発生すれば 1

SendMessage[編集]

ウィンドウが見つからないなどの問題が発生すれば FAIL
それ以外は、メッセージの戻り値(整数)。
メッセージの種類よっては、 reply

Remarks[編集]

Msgには32ビット精度のメッセージ識別子。wParam,lParam引数には32ビットあるいは64ビット(x64版のみ)精度の数値を指定する。
いずれも 0xFF のように16進数で指定することも可能。

WM_SETTEXTなどでwParam,lParamに文字列を渡したい場合は、 SendMessage, 0xC, 0, "New Title"のように引数を "で囲む。
変数の文字列を渡したい場合は、 SendMessage, 0xC, 0, &NewTitleのように変数名の前に &を付けたものを指定する。

無闇にウィンドウメッセージを送信すると不具合が発生することがあるので注意して使うこと。

SendMessageコマンドは、メッセージを送信後最大5秒間応答を待つ。
5秒以内に応答がなかった場合、ErrorLevelFAILになる。
PostMessageコマンドはメッセージをウィンドウのメッセージキューに追加して即座に終了する。

WinTitleに ahk_id 0xFFFFを指定すると、存在する全てのウィンドウにメッセージを送信する。
Msgに 0x1A(WM_SETTINGCHANGE)などを指定するときに使うとよい。

メッセージには構造体のアドレスを要求するものがあるが、自プロセス以外のウィンドウに VarSetCapacitry() で確保したアドレスを渡しても無効である。
構造体のアドレスが有効なのはメッセージを受けとるプロセスのメモリアドレスなので、DllCall() を使いVirtualAllocEx 等を利用して相手ウィンドウのプロセスにメモリを確保してからそのアドレスを渡してやる必要がある。

Related[編集]

ウィンドウメッセージ一覧, PostMessage/SendMessage関連, ControlSend, WinMenuSelectItem

Example(s)[編集]

; Turn Monitor Off:
SendMessage, 0x112, 0xF170, 2,, Program Manager   ; 0x112 is WM_SYSCOMMAND, 0xF170 is SC_MONITORPOWER.
; Note for the above: Use -1 in place of 2 to turn the monitor on.
; Use 1 in place of 2 to activate the display's "low power" mode.
; Start the user's chosen screen saver:
SendMessage, 0x112, 0xF140, 0,, Program Manager   ; 0x112 is WM_SYSCOMMAND, and 0xF140 is SC_SCREENSAVE.
; Scroll up by one line (for a control that has a vertical scroll bar):
ControlGetFocus, control, A
SendMessage, 0x115, 0, 0, %control%, A
; Scroll down by one line:
ControlGetFocus, control, A
SendMessage, 0x115, 1, 0, %control%, A
; This example asks Winamp which track number is currently active:
SetTitleMatchMode, 2
SendMessage, 1024, 0, 120, - Winamp
If ErrorLevel <> FAIL
{
  ErrorLevel++  ; Winamp's count starts at "0", so adjust by 1.
  MsgBox, Track #%ErrorLevel% is active or playing.
}