SendMessage

ウィンドウまたはコントロールにメッセージを送信し、応答を待ちます。

Result := SendMessage(MsgNumber , wParam, lParam, Control, WinTitle, WinText, ExcludeTitle, ExcludeText, Timeout)

パラメータ

MsgNumber

型:整数

送信するメッセージ番号です。メッセージリストを参照して番号を決定してください。

wParam, lParam

型:整数またはオブジェクト

どちらかを省略したときは、0を送信します。そうでなければ、メッセージの1番目と2番目のコンポーネントを指定します。

各パラメータは、整数またはBufferなどのPtrプロパティを持つオブジェクトでなければなりません。文字列へのポインタが必要なメッセージには、BufferまたはStrPtr関数を使用します。SendMessageに変数のアドレスを渡して変数が含む文字列を変更した場合、その後VarSetStrCapacity(&MyVar, -1)を呼び出して変数の長さを更新する必要があります。

AutoHotkeyまたはターゲットウィンドウが32ビットの場合、パラメータの下位32ビットのみが使用されます。つまり、符号付き値の場合は-2147483648~2147483647(-0x80000000~0x7FFFFFFF)、符号なし値の場合は0~4294967295(0xFFFFFF)範囲外の場合は値が切り捨てられます。AutoHotkeyとターゲットウィンドウの両方が64ビットである場合、AutoHotkeyがサポートする任意の整数値を使用することができます。

Control

型:文字列整数またはオブジェクト

省略したときは、メッセージはターゲットウィンドウのコントロールにではなく、ウィンドウそのものに送信されます。そうでなければ、コントロールのClassNN、テキストまたはHWNDか、Hwndプロパティを持つオブジェクトを指定します。詳しくはControlパラメータをご覧ください。

本パラメータでHWND(整数またはオブジェクト)を指定する場合、コントロール(子ウィンドウ)のHWNDであることは必須ではありません。つまり、トップレベルウィンドウのHWNDにもなり得るのです。

WinTitle, WinText, ExcludeTitle, ExcludeText

型:文字列整数またはオブジェクト

もしこれらの項目が未設定または省略されたときは、最後に見つかったウィンドウが使用されます。そうでないときは、WinTitleウィンドウタイトルまたはターゲットウィンドウを識別するための他の基準、および/またはWinTextにターゲットウィンドウの単一のテキスト要素からの部分文字列(付属のWindow Spyユーティリティを使えばわかります)を指定します。

ExcludeTitleExcludeTextはウィンドウのタイトルまたはテキストで除外するために使用します。指定の仕方はWinTitleWinTextに似ていますが、ExcludeTitleはウィンドウのタイトル以外の基準(ウィンドウクラスやHWNDなど)を認識しません。

ウィンドウのタイトルとテキストは大文字と小文字を区別します。DetectHiddenWindows関数 と DetectHiddenText関数で変更しない限り、初期設定では非表示ウィンドウは検出されず、非表示テキストは検出されます。SetTitleMatchMode関数で変更しない限り、初期設定ではウィンドウのタイトルはその中のどこかにWinTitleまたはExcludeTitleを含んでいれば一致します。

Timeout

型:整数

省略したときの初期値は5000です。Otherwise, specify the maximum number of milliseconds to wait for the target window to process the message. この時間内にメッセージが処理されない場合、TimeoutErrorが投げられます。Specify 0 to wait indefinitely. A negative number causes SendMessage to time out immediately.

戻り値

型:整数

この関数はメッセージの結果を返します。メッセージの性質やターゲットウィンドウによっては、"返信"となる場合があります。

設定可能な値の範囲は、ターゲットウィンドウと実行中のAutoHotkeyのバージョンに依存します。32ビット版のAutoHotkeyを使用している場合、またはターゲットウィンドウが32ビットの場合、結果は0~4294967295の32ビット符号なし整数になります。64ビット版AutoHotkeyを64ビットウィンドウで使用する場合、結果は-9223372036854775808から9223372036854775807の間の64ビット符号付き整数となります。

結果が32ビット符号付き整数(-2147483648から2147483648までの値)を意図している場合、次のように32ビットに切り捨てて符号付き値に変換することができます:

MsgReply := MsgReply << 32 >> 32

AutoHotkeyの64bit版でも、32bitウィンドウの結果はゼロ拡張されるため、この変換が必要な場合があります。例えば、32ビットウィンドウからの-1の結果は、どのバージョンのAutoHotkeyでも0xFFFFFFとして表示されますが、64ビットウィンドウからの-1の結果は、AutoHotkey 32ビットでは0xFFFFFF、AutoHotkey 64ビットでは-1として表示されます。

エラー処理

ウィンドウまたはコントロールが見つからないときは、TargetErrorがスローされます。

メッセージがタイムアウトした場合、TimeoutErrorが投げられます。

メッセージが送信できなかったときは、OSErrorがスローされます。例えば、ターゲットウィンドウがスクリプトよりも高い整合性レベルで実行されている場合(スクリプトは管理者として実行されているが、スクリプトはそうではない)、メッセージがブロックされることがあります。

備考

誤ったウィンドウにメッセージを送信したり、無効なメッセージを送信したりすると、予期せぬ動作が発生したり、ターゲットアプリケーションがクラッシュしたりする可能性があるため、この関数は慎重に使用しなければなりません。これは、ほとんどのアプリケーションが、外部ソースからのある種のメッセージを期待するように設計されていないためです。

SendMessageは、ターゲットウィンドウがメッセージを処理するのを、タイムアウト時間まで待ちます。一方、PostMessageは、確認や返信を待たずに、ターゲットウィンドウに関連するメッセージキューにメッセージを配置します。

文字列パラメータは、アドレスで渡す必要があります。事例:

ListVars
WinWaitActive "ahk_class AutoHotkey"
SendMessage 0x000C, 0, StrPtr("New Title")  ; 0X000CはWM_SETTEXTです。

非表示や無効になっているものも含め、システム内のすべてのウィンドウにメッセージを送るには、WinTitle0xFFFFを指定します(0xFFFFはHWND_BROADCAST)。この手法は、次の例のように、放送を目的としたメッセージにのみ使用する必要があります:

SendMessage 0x001A,,,, 0xFFFF  ; 0x001AはWM_SETTINGCHANGEです。

スクリプトにメッセージを受信させるには、OnMessageを使用します。

この機能の使い方については、「メッセージチュートリアル」をご覧ください。

PostMessageメッセージリストメッセージチュートリアルOnMessageWinampの自動化DllCallControlSendMenuSelect

ホットキーでモニターをオフにします。SendMessage行で、モニターの電源をオンにする場合は数字の2を-1に、モニターの低電力モードを有効にする場合は数字を1に置き換えてください。

#o::  ; Win+O
{
    Sleep 1000  ; Give user a chance to release keys (in case their release would wake up the monitor again).
    ; Turn Monitor Off:
    SendMessage 0x0112, 0xF170, 2,, "Program Manager"  ; 0x0112 is WM_SYSCOMMAND, 0xF170 is SC_MONITORPOWER.
}

ユーザーが選択したスクリーンセーバーを起動します。

SendMessage 0x0112, 0xF140, 0,, "Program Manager"  ; 0x0112 is WM_SYSCOMMAND, and 0xF140 is SC_SCREENSAVE.

1行分スクロールアップします(垂直スクロールバーを持つコントロールの場合)。

SendMessage 0x0115, 0, 0, ControlGetFocus("A")

1行分スクロールダウンします(垂直スクロールバーを持つコントロールの場合)。

SendMessage 0x0115, 1, 0, ControlGetFocus("A")

Winampに、現在アクティブなトラック番号を問い合わせます(詳しくは「Winampの自動化」を参照)。

SetTitleMatchMode 2
TrackNumber := SendMessage(0x0400, 0, 120,, "- Winamp")
TrackNumber++  ; Winamp's count starts at 0, so adjust by 1.
MsgBox "Track #" TrackNumber " is active or playing."

AHKスクリプトのプロセスIDを検索します(WinGetPIDの代わりとなるもの)。

SetTitleMatchMode 2
DetectHiddenWindows true
PID := SendMessage(0x0044, 0x405, 0, , "SomeOtherScript.ahk - AutoHotkey v")
MsgBox PID " is the process id."