WinProc()vs主消息循环

时间:2015-12-27 14:16:22

标签: windows winapi

我注意到WinAPI中的某些消息只能在PeekMessage()的“主消息循环”中检索(如WM_QUIT),其他消息只能在用户定义的winProc()中检索功能(如WM_CLOSEWM_SIZE),以及WM_MOUSEMOVE等一些消息都会被检索到。

有什么区别?我怎么知道WM消息将被发送到哪里?

1 个答案:

答案 0 :(得分:2)

使用NULL窗口句柄发布的消息只能在消息循环中检索。必然如此,DispatchMessage()无法完成其工作。这种情况非常罕见。

但是,WM_QUIT,请注意PostQuitMessage()如何处理窗口句柄。这是相当不可避免的,当你调用PostQuitMessage()时,你(通常)没有任何窗口,所以只有一个NULL窗口句柄是明智的。当然,它的真正目的是使GetMessage()返回FALSE,从而终止消息循环。

我能想到的另一个案例是使用PostThreadMessage()生成的消息。请注意这是一个非常危险的函数,它永远不应该用于将消息发布到一个显示任何窗口的线程。当另一个消息循环泵出时,这些消息落入比特桶中。就像允许用户移动/调整窗口大小的那个一样。或者保留MessageBox()模式的那个。它仅适用于进程和线程互操作编组。

所以请忽略这一点,这是一个角落案例。