2012-09-05 77 views
7

Win32程序通常有一个消息循环回路调用的GetMessage的PeekMessage,然后调用在DispatchMessage分发消息到相关窗口的窗口proceedure。是否需要在win32程序中调用DispatchMessage?

但是有没有需要实际做到这一点?我可以直接在消息循环中直接查看MSG对象,并执行那里所需的操作,而无需致电DispatchMessage?我在谈论的情况下,我有一个单一的窗口没有其他的窗口控件,例如,如果该窗口只用作direct3d显示窗口,所以消息将始终指向唯一的窗口。

大部分我只是好奇,但也可能导致我的代码的某些方面更清洁。

回答

12

您可以拨打DispatchMessage将邮件传送到适当的窗口,传送到其“窗口过程”。你认为你只有一个窗口,但它真的是唯一的一个窗口吗? COM将创建帮助程序窗口,其他子系统也可能创建帮助程序隐藏窗口,谁将把消息发送到共享消息队列并发送到这些窗口。无需考虑很多关于这些细节的信息,您就可以使用API​​来发布它们。你必须这样做,因为这些子系统依赖于消息泵的存在。

Spy++ Windows SDK工具可能会帮助您查看您确实拥有多少个窗口。

如果你真的拥有唯一的窗口,不管你的处理程序是从DispatchMessage内部调用还是直接通过消息泵调用都没有太大区别。

+0

这很有道理,谢谢! – jcoder

+1

'DispatchMessage'和'CallWindowProc'也可以做类似考虑windows挂钩的事情。即使只有一个窗口,你也需要使用它们。我相信有些消息不能在DispatchMessage之外正确处理,但我没有任何例子可以解决我的问题。也许像'WM_PAINT'这样的东西。 – tenfour

+1

@tenfour,或许更准确地说,某些消息无论如何都会通过WindowProc调用,并且不会作为单独的消息存在队列中。所以,无论如何WindowProc都是必须的。仍然可以通过这两种方式处理队列中发布的内容。我想不出为什么要在泵的一边处理它们。 –

相关问题