PostMessage / SendMessage

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

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

Parameters

引数名説明
Msg ウィンドウメッセージ番号。
一般的なメッセージの一覧については、WinAPI Database for VB Programmerのアルファベット順表示「W」の項あたりを参照。
wParam メッセージの引数。0もしくは省略のときは0が送られる。
lParam メッセージの引数
Control 省略もしくは空白のときは、ウィンドウに直接メッセージが送られる。
それ以外の指定方法はウィンドウ指定の方法参照。
WinTitle ウィンドウ指定の方法参照。
WinText
ExcludeTitle
ExcludeText

ErrorLevel

PostMessage

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

SendMessage

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

Remarks

Msg,wParam,lParam引数には0...4294967295の数値を指定する。
0xFFのように16進数で指定することも可能。

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

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

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

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

Related

Message List, Message Tutorial, Automating Winamp, 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.
}