GetMessage 関数 (winuser.h)
呼び出し元スレッドのメッセージ キューからメッセージを取得します。 関数は、投稿されたメッセージが取得できるようになるまで、受信した送信メッセージをディスパッチします。
ただし、PeekMessage などの GetMessage 関数は、返される前にメッセージが投稿されるまで GetMessage をブロックします。
構文
BOOL GetMessage(
[out] LPMSG lpMsg,
[in, optional] HWND hWnd,
[in] UINT wMsgFilterMin,
[in] UINT wMsgFilterMax
);
パラメーター
[out] lpMsg
種類: LPMSG
スレッドのメッセージ キューからメッセージ情報を受信する MSG 構造体へのポインター。
[in, optional] hWnd
型: HWND
メッセージを取得するウィンドウへのハンドル。 ウィンドウは現在のスレッドに属している必要があります。
hWnd が NULL の場合、GetMessage は現在のスレッドに属するすべてのウィンドウのメッセージと、hwnd 値が NULL である現在のスレッドのメッセージ キュー上のすべてのメッセージを取得します (MSG 構造体を参照)。 したがって、hWnd が NULL の場合、ウィンドウ メッセージとスレッド メッセージの両方が処理されます。
hWnd が -1 の場合、GetMessage は現在のスレッドのメッセージ キューのメッセージのみを取得します。そのメッセージの hwnd 値は NULL です。つまり、PostMessage によって投稿されたスレッド メッセージ (hWnd パラメーターが NULL の場合) または PostThreadMessage。
[in] wMsgFilterMin
型: UINT
取得する最小メッセージ値の整数値。 WM_KEYFIRST (0x0100) を使用して、最初のキーボード メッセージを指定するか、WM_MOUSEFIRST (0x0200) を使用して最初のマウス メッセージを指定します。
ここで とwMsgFilterMax のWM_INPUTを使用して、 WM_INPUT メッセージのみを指定します。
wMsgFilterMin と wMsgFilterMax の両方がゼロの場合、GetMessage は使用可能なすべてのメッセージを返します (つまり、範囲フィルター処理は実行されません)。
[in] wMsgFilterMax
型: UINT
取得する最大メッセージ値の整数値。 WM_KEYLASTを使用して、最後のキーボード メッセージを指定するか、最後のマウス メッセージを指定するWM_MOUSELASTを使用します。
ここで とwMsgFilterMin のWM_INPUTを使用して、 WM_INPUT メッセージのみを指定します。
wMsgFilterMin と wMsgFilterMax の両方がゼロの場合、GetMessage は使用可能なすべてのメッセージを返します (つまり、範囲フィルター処理は実行されません)。
戻り値
種類: BOOL
関数が WM_QUIT以外のメッセージを取得する場合、戻り値は 0 以外です。
関数が WM_QUIT メッセージを取得した場合、戻り値は 0 になります。
エラーが発生した場合、戻り値は -1 になります。 たとえば、 hWnd が無効なウィンドウ ハンドルであるか、 lpMsg が無効なポインターである場合、関数は失敗します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
戻り値には 0 以外、0、または -1 を指定できるため、次のようなコードは避けてください。
while (GetMessage( lpMsg, hWnd, 0, 0)) ...
hWnd が無効なパラメーターである場合に -1 の戻り値が発生する可能性 (既に破棄されているウィンドウを参照するなど) は、このようなコードが致命的なアプリケーション エラーにつながる可能性があることを意味します。 代わりに、次のようなコードを使用します。
BOOL bRet;
while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
if (bRet == -1)
{
// handle the error and possibly exit
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
注釈
アプリケーションは通常、戻り値を使用して、メイン メッセージ ループを終了してプログラムを終了するかどうかを判断します。
GetMessage 関数は、IsChild 関数で指定された、および wMsgFilterMin パラメーターと wMsgFilterMax パラメーターによって指定されたメッセージ値の範囲内で、hWnd パラメーターまたはその子で識別されるウィンドウに関連付けられたメッセージを取得します。 アプリケーションでは、 wMsgFilterMin パラメーターと wMsgFilterMax パラメーター内の低い単語のみを使用できること に 注意してください。高い単語はシステム用に予約されています。
GetMessage は、wMsgFilterMin と wMsgFilterMax に指定した値に関係なく、常にWM_QUITメッセージを取得します。
この呼び出し中に、システムは保留中のキューに入れないメッセージ、つまり SendMessage、SendMessageCallback、SendMessageTimeout、または SendNotifyMessage 関数を使用して、呼び出し元スレッドが所有するウィンドウに送信されたメッセージを配信します。 次に、指定したフィルターに一致するキューに登録された最初のメッセージが取得されます。 システムは、内部イベントを処理することもできます。 フィルターが指定されていない場合、メッセージは次の順序で処理されます。
- 送信済みメッセージ
- 投稿されたメッセージ
- 入力 (ハードウェア) メッセージとシステム内部イベント
- 送信済みメッセージ (もう一度)
- メッセージのWM_PAINT
- メッセージをWM_TIMER する
GetMessage では、 キューからWM_PAINT メッセージは削除されません。 メッセージは処理されるまでキューに残ります。
最上位のウィンドウが数秒間以上メッセージへの応答を停止した場合、システムはウィンドウが応答していないと見なし、同じ z オーダー、場所、サイズ、およびビジュアル属性を持つゴースト ウィンドウに置き換えます。 これにより、ユーザーはそれを移動したり、サイズを変更したり、アプリケーションを閉じることもできます。 ただし、アプリケーションが実際に応答していないため、使用できるアクションはこれらだけです。 デバッガー モードの場合、システムはゴースト ウィンドウを生成しません。
DPI 仮想化
この API は DPI 仮想化には参加しません。 出力は、メッセージがターゲットとしているウィンドウのモードです。 呼び出し元のスレッドは考慮されません。例
例については、「 メッセージ ループの作成」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 2000 Professional [デスクトップ アプリのみ] |
サポートされている最小のサーバー | Windows 2000 Server [デスクトップ アプリのみ] |
対象プラットフォーム | Windows |
ヘッダー | winuser.h (Windows.h を含む) |
Library | User32.lib |
[DLL] | User32.dll |
API セット | ext-ms-win-ntuser-message-l1-1-0 (Windows 8で導入) |
関連項目
概念
リファレンス