同步使用GetWindowText

Pup*_*ppy 1 windows winapi

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

Ben*_*igt 7

GetWindowText只是一个薄的包装SendMessage(WM_GETTEXT).

发送到窗口的消息总是在创建窗口的线程中处理(窗口具有"线程关联性").发送的消息不通过DispatchMessage,而不是GetMessage(或PeekMessageMsgWaitForMultipleObjects)会直接调用窗口过程,从另一个线程发送的消息.如果消息是从同一个线程发送的,SendMessage则会调用窗口过程.


SendMessage文件说:

SendMessage函数调用指定窗口的窗口过程,并且在窗口过程处理完消息之前不会返回.

GetMessage文件说:

从调用线程的消息队列中检索消息.该函数调度传入的已发送消息,直到发布的消息可供检索.

PeekMessage文档:

调度传入的已发送消息,检查线程消息队列中是否有已发布的消息,并检索消息(如果存在).


发送消息的行为之前已在Raymond Chen的优秀博客The Old New Thing中突出显示,所有Win32开发人员都应该订阅:

如果使用上述任何发送类型函数将消息发送到属于发送线程的窗口,则同步调用.

回想一下,SendMessage将消息直接传递给窗口过程; 消息泵永远不会看到它.


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