次の方法で共有


GetMessageW 関数 (winuser.h)

呼び出し元スレッドのメッセージ キューからメッセージを取得します。 この関数は、送信されたメッセージが取得可能になるまで、受信したメッセージをディスパッチします。

GetMessageとは異なり、PeekMessage 関数は、メッセージがポストされるのを待ってから戻りません。

構文

BOOL GetMessageW(
  [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(つまり、hWnd パラメーターが NULLの場合) によってポストされたスレッド メッセージ (hWnd パラメーターが NULLの場合) または postThreadMessage、現在のスレッドのメッセージ キュー上のメッセージのみを取得します。

[in] wMsgFilterMin

型: UINT

取得するメッセージの最小値の整数値。 WM_KEYFIRST (0x0100) を使用して、最初のキーボード メッセージを指定するか、WM_MOUSEFIRST (0x0200) を使用して最初のマウス メッセージを指定します。

ここでは、wMsgFilterMax WM_INPUT 使用して、WM_INPUT メッセージのみを指定します。

wMsgFilterMinwMsgFilterMax の両方が 0 の場合、使用可能なすべてのメッセージ GetMessage が返されます (つまり、範囲のフィルター処理は実行されません)。

[in] wMsgFilterMax

型: UINT

取得するメッセージの最大値の整数値。 WM_KEYLAST を使用して、最後のキーボード メッセージを指定するか、最後のマウス メッセージを指定する WM_MOUSELAST を使用します。

WM_INPUT メッセージのみを指定するには、ここでは wMsgFilterMin WM_INPUT を使用します。

wMsgFilterMinwMsgFilterMax の両方が 0 の場合、使用可能なすべてのメッセージ 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 関数で指定された、hWnd パラメーターまたはその子のいずれかによって識別されたウィンドウに関連付けられたメッセージを取得します。また、wMsgFilterMin および wMsgFilterMax パラメーターによって指定されたメッセージ値の範囲内です。 アプリケーションでは、wMsgFilterMin 内の低い単語のみを使用でき、wMsgFilterMax パラメーターを できることに注意してください。高い単語はシステム用に予約されています。

getMessage は、wMsgFilterMin と wMsgFilterMaxに指定した値 関係なく、常に WM_QUIT メッセージを取得します。

この呼び出し中に、システムは保留中のキューに入れられないメッセージ、つまり、SendMessageSendMessageCallbackSendMessageTimeoutまたは SendNotifyMessage 関数を使用して、呼び出し元スレッドが所有するウィンドウに送信されたメッセージ 配信します。 次に、指定したフィルターに一致するキューに登録された最初のメッセージが取得されます。 システムは内部イベントを処理することもできます。 フィルターが指定されていない場合、メッセージは次の順序で処理されます。

  • 送信済みメッセージ
  • 投稿されたメッセージ
  • 入力 (ハードウェア) メッセージとシステム内部イベント
  • 送信されたメッセージ (もう一度)
  • メッセージの WM_PAINT
  • メッセージの WM_TIMER
ポストされたメッセージの前に入力メッセージを取得するには、wMsgFilterMin を使用し、wMsgFilterMax パラメーターを します。

GetMessage は、キューから WM_PAINT メッセージを削除しません。 メッセージは処理されるまでキューに残ります。

最上位のウィンドウが数秒間以上メッセージへの応答を停止した場合、システムはウィンドウが応答していないと見なし、同じ z オーダー、位置、サイズ、およびビジュアル属性を持つゴースト ウィンドウに置き換えます。 これにより、ユーザーはそれを移動したり、サイズを変更したり、アプリケーションを閉じたりすることができます。 ただし、アプリケーションが実際に応答しないため、これらは唯一のアクションを使用できます。 デバッガー モードの場合、システムはゴースト ウィンドウを生成しません。

DPI 仮想化

この API は DPI 仮想化には参加しません。 出力は、メッセージが対象としているウィンドウのモードです。 呼び出し元のスレッドは考慮されません。

例については、「メッセージ ループの作成」を参照してください。

手記

winuser.h ヘッダーは、Unicode プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択するエイリアスとして GetMessage を定義します。 エンコードに依存しないエイリアスをエンコードに依存しないコードと組み合わせて使用すると、コンパイルエラーやランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「関数プロトタイプの 規則」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされる最小サーバー Windows 2000 Server [デスクトップ アプリのみ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winuser.h (Windows.h を含む)
ライブラリ User32.lib
DLL User32.dll
API セットの ext-ms-win-ntuser-message-l1-1-0 (Windows 8 で導入)

関連項目

概念

IsChild の

MSG

メッセージとメッセージ キューの

PeekMessage の

PostMessage を する

PostThreadMessage を する

リファレンス

WaitMessage の