2012-02-19 54 views
1

我不太了解GetWindowText如何在与调用方相同的线程上工作。如果GetWindowText阻塞,直到消息被处理,线程怎么能调用DispatchMessage?它在GetWindowText内被封锁。这是否意味着GetWindowText必须始终从操作消息循环的单独线程调用?同步使用GetWindowText

回答

7

GetWindowText只是SendMessage(WM_GETTEXT)的薄包装。

发送到窗口的消息总是在创建窗口的线程中处理(窗口具有“线程关联”)。发送的消息不通过DispatchMessage,而是GetMessage(或PeekMessageMsgWaitForMultipleObjects)将直接调用窗口过程,以处理从另一个线程发送的消息。如果消息来自同一个线程,SendMessage将调用窗口过程。


SendMessage documentation说:

SendMessage函数调用指定的窗口的窗口过程,并不会返回,直到窗口过程已经处理了该消息。

而且the GetMessage documentation says

检索从调用线程的消息队列中的消息。该功能调度传入的已发送消息,直到发布的消息可用于检索。

the PeekMessage docs

急件入方向带发送的消息,检查一个发布消息的线程的消息队列,和检索消息(如果有的话)。


发送消息的行为之前已突出了Raymond Chen's excellent blog, The Old New Thing,所有的Win32开发者应该订阅:

如果您使用上述任何发送型功能发送消息发送到属于发送线程的窗口,则该呼叫将同步进行。

回想SendMessage直接将消息传送到窗口过程;消息泵永远不会看到它。


当然,还有相关这里找到在计算器上的问题:

+0

我看到了它的工作通过发送一个 信息。我没有看到它没有像大多数消息那样排队消息。 – Puppy 2012-02-19 04:26:16

+0

@DeadMG:你肯定有足够的权利来解决一些基本的RTFM问题,我只是很惊讶,你不知道在哪里寻找这个问题。 – 2012-02-19 04:30:56