【发布时间】:2014-04-09 10:53:56
【问题描述】:
首先我想请你不要误解这个问题。我不是在问 SendMessage 是如何工作的,而是为什么它被设计成它的工作方式。基本上,我想知道为什么不能直接从工作线程调用窗口过程,就像从窗口线程调用一样,而不是将消息泵入消息队列?
在工作线程中的一个非常简单的情况下,我可以这样做:
WndProc(hWnd,MY_MESSAGE,wParam,lParam);
代替:
SendMessage(hWnd,MY_MESSAGE,wParam,lParam);
并立即得到响应。直接调用 WndProc 有什么缺点吗?
我可以理解,当您想向另一个进程拥有的窗口发送消息时,事情会变得更加复杂,但不能存在类似 SendMessage 的函数,该函数在工作线程中工作相同,例如在窗口线程?不存在的背后有什么原因吗?预先感谢您的任何解释。
【问题讨论】:
-
这归结为窗口与创建它们的线程有关联。所以这种行为是使系统线程安全的一部分。
-
编写这样的代码没有任何意义。您改为重构窗口过程并将 case: 语句中的代码移动到单独的函数中。并调用该函数。 SendMessage() 的要点是你不知道窗口的实现细节。在这种情况下,从另一个线程调用它是一个很好的方法来打断你的腿。总是有太多的代码挂在消息管道上,这完全是线程不安全的。像反恶意软件、可访问性、Windows 挂钩等。