Mfc

SendMessageとPostMessageの違い



Difference Between Sendmessage

メッセージを送る:

これは、指定されたメッセージを1つまたは複数のウィンドウに送信する関数です。
SendMessageは、指定されたウィンドウのウィンドウプロシージャを呼び出し、
ウィンドウプロシージャがメッセージを処理するまで戻りません。
対照的に、PostMessage関数は、スレッドのメッセージを投稿します。
メッセージキューに入れてすぐに戻ります。



LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

パラメーター:
hWnd:
[in]ウィンドウプロシージャがメッセージを受信するウィンドウに処理します。
このパラメータがHWND_BROADCASTの場合、メッセージはシステム内のすべての最上位ウィンドウに送信されます。
無効または非表示の所有されていないウィンドウ、重複したウィンドウ、ポップアップウィンドウを含む
ただし、メッセージは子ウィンドウには送信されません。
メッセージ:
[in]送信するメッセージを指定します。
wParam:
[in]追加のメッセージ固有の情報を指定します。
lParam:
[in]追加のメッセージ固有の情報を指定します。
戻り値:
戻り値は、メッセージ処理の結果を指定し、送信されたメッセージによって異なります。

PostMessage:



PostMessage関数は、メッセージにメッセージを配置(投稿)します。
指定されたウィンドウを作成したスレッドに関連付けられたキュー
スレッドがメッセージを処理するのを待たずに戻ります。
スレッドに関連付けられたメッセージキューにメッセージを投稿するには、
PostThreadMessage関数を使用します。

Bool PostMessage( HWND hWnd, // handle to destination window UINT Msg, // message WPARAM wParam, // first message parameter LPARAM lParam // second message parameter )

パラメーター:
hWnd
[in]ウィンドウプロシージャがメッセージを受信するウィンドウへのハンドル。
次の値には特別な意味があります。
HWND_BROADCAST:
メッセージは、システムのすべてのトップレベルウィンドウに投稿されます。
無効または非表示の所有されていないウィンドウ、重複したウィンドウ、
およびポップアップウィンドウ。メッセージは子ウィンドウに投稿されません。
ヌル:
この関数は、PostThreadMessageの呼び出しのように動作します。
現在のスレッドの識別子に設定されたdwThreadIdパラメーター。
メッセージ
[in]投稿するメッセージを指定します。
wParam
[in]追加のメッセージ固有の情報を指定します。
lParam
[in]追加のmessgae固有の情報を指定します。
戻り値:
関数が成功した場合、戻り値はゼロ以外です。
関数が失敗した場合、戻り値はゼロです。拡張エラー情報を取得するには、GetLastErrorを呼び出します。

上記はMSDNでのSendMessageとPostMessageの2つの関数の紹介であり、そこからそのような文があることがわかります。 SendMessageは、指定されたウィンドウのウィンドウプロシージャを呼び出し、ウィンドウプロシージャがメッセージを処理するまで戻りません。これとは対照的に、PostMessage関数は、メッセージをスレッドのメッセージキューに投稿し、すぐに戻ります。 その意味は SendMessage関数はメッセージをウィンドウコードに送信し、メッセージが処理されるまで戻りませんが、PostMessage関数はメッセージをメッセージキューに入れてすぐに返します。つまり、SendMessageは同期メッセージ配信に属し、PostMessageは非同期メッセージ配信です。