Is calling DispatchMessage in win32 programs necessary?
Win32程序通常具有一个消息循环,该循环循环调用GetMessage或PeekMessage,然后调用DispatchMessage将消息分派到相关窗口的窗口过程中。
但是实际上需要这样做吗? 我可以直接在消息循环中查看MSG对象并执行所需的操作而无需调用DispatchMessage吗? 我说的是我只有一个窗口而没有其他窗口控件的情况,例如,如果该窗口仅用作Direct3d显示窗口,则消息将始终指向唯一的窗口。
大多数情况下,我只是很好奇,但这也可能导致代码的某些方面变得更加清晰。
您调用DispatchMessage将消息传递到适当的窗口,并传递到其"窗口proc"。 您认为您只有一个窗口,但它真的是唯一的一个吗? COM将创建帮助程序窗口,其他子系统也可能创建帮助程序隐藏窗口,后者将传递张贴到共享消息队列并发送到这些窗口的消息。 无需过多考虑这些细节,您就可以使用API来分派它们。 而且您必须这样做,因为那些子系统依赖于消息泵的存在。
Spy++ Windows SDK工具可能会帮助您查看您实际上拥有多少个窗口。
即使确实只有一个窗口,无论是从DispatchMessage内部调用处理程序还是直接由消息泵调用处理程序,都没有太大的区别。
-
DispatchMessage和CallWindowProc也可以做类似考虑Windows钩子的操作。 即使只有一个窗口,您也需要使用它们。 我相信在DispatchMessage之外无法正确处理某些消息,但我没有任何例子可以解决。 也许像WM_PAINT之类的东西。
-
@tenfour,也许更正确的说法是某些消息无论如何都将通过WindowProc调用,并且不会作为单独的消息存在于队列中。 因此,在任何情况下,WindowProc都是必须的。 仍然可以用两种方式处理队列中发布的那些内容。 我想不出为什么要在泵侧在那里处理它们的原因。
-
还请注意,您可能会认为您只有一个窗口,但是许多组件(例如DirectX)将代表您创建窗口,因此实际上您有多个窗口。 您只是没有意识到这一点。