【问题标题】:Is calling DispatchMessage in win32 programs necessary?是否需要在 win32 程序中调用 DispatchMessage?
【发布时间】:2012-08-30 05:19:45
【问题描述】:

Win32程序一般都有一个消息循环,循环调用GetMessagePeekMessage,然后调用DispatchMessage将消息派发到窗口过程相关窗口。

但实际上有必要这样做吗?我是否可以直接在消息循环中查看 MSG 对象并在那里执行所需的操作而不调用 DispatchMessage?我说的是我只有一个窗口而没有其他窗口控件的情况,例如,如果该窗口仅用作 direct3d 显示窗口,那么消息将始终指向唯一的窗口。

主要是我只是好奇,但它也可能导致我的代码的某些方面也更干净。

【问题讨论】:

    标签: windows winapi


    【解决方案1】:

    您调用DispatchMessage 将消息传递到正确的窗口,传递到它的“window proc”。你以为你只有一扇窗,但它真的只有一扇吗? COM 将创建辅助窗口,其他子系统也可能创建辅助隐藏窗口,谁将传递发布到共享消息队列并寻址到这些窗口的消息。无需过多考虑这些细节,您就可以使用 API 来调度它们。您必须这样做,因为这些子系统依赖于消息泵的存在。

    Spy++ Windows SDK 工具可能会帮助您了解您实际拥有的窗口数量。

    如果您确实有唯一的窗口,那么无论您的处理程序是从 DispatchMessage 内部调用还是直接由您的消息泵调用,都没有太大区别。

    【讨论】:

    • DispatchMessageCallWindowProc 也可以考虑 windows 挂钩。即使只有一个窗口,您也需要使用它们。我相信在DispatchMessage 之外无法正确处理某些消息,但我没有想到任何示例。也许像WM_PAINT这样的东西。
    • @tenfour,也许更正确的说法是某些消息无论如何都会通过 WindowProc 调用,并且不会作为单独的消息存在于队列中。因此,无论如何,WindowProc 都是必须的。仍然可以以两种方式处理发布在队列中的那些。我想不出为什么要在泵侧处理它们的原因。
    • 还请注意,您可能认为您只有一个窗口,但许多组件(例如 DirectX)会代表您创建窗口,因此您实际上有多个窗口。你只是没有意识到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2012-04-21
    • 2014-09-17
    • 2012-09-08
    • 2012-11-19
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多