2012-02-19 20 views
1

GetWindowTextが呼び出し元と同じスレッド上のウィンドウでどのように動作するのかよくわかりません。メッセージが処理されるまでGetWindowTextがブロックされる場合、スレッドはどのようにしてDispatchMessageを呼び出しますか?それはGetWindowTextの内部でブロックされています。つまり、GetWindowTextは、メッセージループを操作するスレッドとは別のスレッドから常に呼び出さなければなりませんか?GetWindowTextを同期的に使用する

答えて

7

GetWindowTextは、SendMessage(WM_GETTEXT)の単なる薄いラッパーです。

ウィンドウに送信されたメッセージは、ウィンドウを作成したスレッドで常に処理されます(ウィンドウには「スレッドアフィニティ」があります)。送信メッセージがDispatchMessageを経由せず、むしろGetMessage(またはPeekMessageまたはMsgWaitForMultipleObjects)は、別のスレッドから送信されたメッセージに対して直接ウィンドウプロシージャを呼び出します。メッセージが同じスレッドから送信された場合は、SendMessageがウィンドウプロシージャを呼び出します。


SendMessage documentationは言う:

SendMessage関数は、指定されたウィンドウのウィンドウプロシージャを呼び出し、ウィンドウプロシージャがメッセージを処理するまで戻りません。

そしてthe GetMessage documentation says

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

着信

ディスパッチは、メッセージを送信し、投稿メッセージのスレッドメッセージキューをチェックし、(存在する場合)メッセージを検索します。あなたが送信する上記送信型関数のいずれかを使用している場合

:メッセージを送信する動作は、以前にそのすべてのWin32開発者が購読するべきで、Raymond Chen's excellent blog, The Old New Thing上で強調表示された


メッセージを送信スレッドに属するウィンドウに送信すると、呼び出しは同期して行われます。

SendMessageがウィンドウプロシージャに直接メッセージを配信することを思い出してください。メッセージポンプはそれを決して見ません。


そしてもちろん、StackOverflowの上ここで見つける関連の質問があります。

+0

は、私はそれが送ることによって、働いていたことがわかりましたaメッセージ。私はそれがほとんどのメッセージのようにメッセージをキューに入れなかったことを読まなかった。 – Puppy

+0

@DeadMG:基本的なRTFMの質問には十分な貢献をしていると確信していますが、私はちょうどこの場所を探す場所が分からないことに驚いています。 –

関連する問題