GetMessage

https://msdn.microsoft.com/ja-jp/library/ms644958.aspx https://msdn.microsoft.com/ja-jp/library/cc428944.aspx https://msdn.microsoft.com/ja-jp/library/ms644958.aspx

呼び出し側スレッドのメッセージキューからメッセージを取得し、指定された構造体にそのメッセージを格納します。ポストされたメッセージが取得可能になるまで、この関数は、着信した送信済みメッセージをディスパッチ(送出)します。

GetMessage 関数とは異なり、PeekMessage 関数は、何かメッセージがポストされるのを待たずに制御を返します。

BOOL GetMessage(
  LPMSG lpMsg,         // メッセージ情報
  HWND hWnd,           // ウィンドウのハンドル
  UINT wMsgFilterMin,  // 最初のメッセージ
  UINT wMsgFilterMax   // 最後のメッセージ
);

パラメータ

lpMsg
1 個の 構造体へのポインタを指定します。関数から制御が返ると、この構造体に、呼び出し側スレッドのメッセージキューから取得したメッセージ情報が格納されます。
hWnd
メッセージの取得に使う(取得元)ウィンドウのハンドルを指定します。このウィンドウは、呼び出し側スレッドに所属していなければなりません。次の値には、特別な意味があります。
意味
NULL呼び出し側スレッドに所属する任意のウィンドウへ送信されたメッセージと、PostThreadMessage 関数を使って呼び出し側スレッドへポストされたスレッドメッセージを取得します。

wMsgFilterMin
取得対象のメッセージの最小値を整数で指定します。
wMsgFilterMax
取得対象のメッセージの最大値を整数で指定します。

戻り値

WM_QUIT 以外のメッセージを取得した場合、0 以外の値が返ります。

WM_QUIT メッセージを取得した場合、0 が返ります。

エラーが発生した場合、-1 が返ります。たとえば、hWnd パラメータで無効なウィンドウハンドルを指定した場合や、lpMsg で無効なポインタを指定した場合は、エラーが発生します。拡張エラー情報を取得するには、 関数を使います。

警告  GetMessage 関数は、0 以外の値、0、-1 のいずれかを返します。したがって、次のようなコードは避けてください。

while (GetMessage(lpMsg, hWnd, 0, 0)) ...

このようなコードを作成すると、GetMessage 関数が失敗して -1(0xFFFFFFFF、つまり TRUE)が返った場合、ループが持続し、致命的なアプリケーションエラーを発生させる可能性があります。

解説

通常、GetMessage 関数の戻り値に基づいて、アプリケーションのメインメッセージループを終了させ、プログラムを終了するかどうかを判定します。

GetMessage 関数は、hWnd パラメータで指定したウィンドウと、IsChild function 関数で子と判断されるウィンドウのいずれかに関連付けられているメッセージのうち、wMsgFilterMin wMsgFilterMax の各パラメータで指定されたメッセージ範囲に該当するものだけを取得します。hWnd パラメータで NULL を指定した場合、GetMessage 関数は呼び出し側スレッドに所属する任意のウィンドウに関連付けられているメッセージと、PostThreadMessage 関数を使って呼び出し側スレッドへポストされたメッセージを取得します。hWnd パラメータで NULL を指定した場合でも、ほかのスレッドに所属するウィンドウに関連付けられているメッセージや、ほかのスレッドに関連付けられているメッセージを取得しません。PostThreadMessage 関数を使ってポストされたスレッドメッセージは、hWnd パラメータで NULL を指定しています。wMsgFilterMin wMsgFilterMax の両方のパラメータで 0 を指定すると、GetMessage は利用可能なすべてのメッセージを返します(メッセージのフィルタリングを行いません)。wMsgFilterMin wMsgFilterMax の各パラメータでどのような値を指定した場合でも、GetMessage は必ず WM_QUIT メッセージを取得することに注意してください。

wMsgFilterMin パラメータで WM_KEYFIRST 定数、wMsgFilterMax パラメータで WM_KEYLAST 定数を指定すると、キーボード入力に関係するメッセージだけを取得できます。同様に、それぞれ WM_MOUSEFIRST 定数と WM_MOUSELAST 定数を指定すると、マウスに関係するメッセージだけを取得できます。wMsgFilterMin wMsgFilterMax の両方のパラメータで 0 を指定すると、GetMessage は利用可能なすべてのメッセージを返します(メッセージのフィルタリングを行いません)。

GetMessage 関数を呼び出すと、呼び出し側スレッドが所有しているウィンドウへ送信されたメッセージのうち、保留されていたものを取得できます。SendMessageSendMessageCallbackSendMessageTimeoutSendNotifyMessage の各関数を使って送信されたメッセージが、これに該当します。システムは、内部イベントを処理することもあります。メッセージは、次の順序で処理されます。

•送信済みメッセージ

•ポスト済みメッセージ

•入力(ハードウェア)メッセージとシステムの内部イベント

•送信済みメッセージ(再度)

WM_PAINT メッセージ

WM_TIMER メッセージ

ポスト済みメッセージより先に入力メッセージを取得するには、wMsgFilterMin wMsgFilterMax の各パラメータを使ってください。メッセージの値の一覧については、MSDN ライブラリの[検索]タブで「4.6 Event Notification Interface」と「WM_APP」を参照してください。

GetMessage 関数は、メッセージキューから WM_PAINT メッセージを削除しません。アプリケーションが WM_PAINT メッセージの処理を終えるまで、このメッセージはキューに残ります。

対応情報

Windows NT/2000:Windows NT 3.1 以降
Windows 95/98:Windows 95 以降
ヘッダー:Winuser.h 内で宣言、Windows.h をインクルード
インポートライブラリ:User32.lib を使用
Unicode:Windows NT/2000 は Unicode 版と ANSI 版を実装

参照

IsChild, , PeekMessage, PostMessage, PostThreadMessage, WaitMessage

表示: