同步使用GetWindowText

时间:2012-02-19 03:46:51

标签: windows winapi

我不太明白GetWindowText如何在与调用者相同的线程上的窗口中工作。如果GetWindowText阻塞直到处理完消息,那么线程如何调用DispatchMessage?它已在GetWindowText内被阻止。这是否意味着必须始终从操作消息循环的单独线程调用GetWindowText

1 个答案:

答案 0 :(得分: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将消息直接传递给窗口过程;消息泵永远不会看到它。


当然,StackOverflow上有相关的问题: