模态对话框的消息泵如何与主应用程序消息泵交互?

Mr.*_*Boy 1 winapi mfc

我的理解是,任何模态对话框都会在专用于该对话框的线程上自动运行其自身的消息泵-是吗?

如果是这样,模式对话框的存在如何影响主应用程序的消息循环?两者是否并行运行,是否优先?

我遇到一种情况,模态对话框似乎在等待几秒钟而被卡住,并想知道是否有可能该对话框被迫等到主应用程序线程不忙?

jam*_*lin 5

正如IInspectable所述,模式对话框将在与调用方相同的线程中运行。因此,如果从具有主消息循环的主UI线程运行对话框,则最终将导致嵌套消息循环。堆栈看起来像:

WinMain
    YourMainMessageLoop
        DispatchMessage
            SomeMessageHandler
                DoModal
Run Code Online (Sandbox Code Playgroud)

DoModal旋转在其自己的GetMessage/ TranslateMessage/ DispatchMessage循环。YourMainMessageLoop就其仍在运行而言,主消息循环(在上面的示例堆栈中)处于“活动”状态,但是对话框的消息循环阻止。执行YourMainMessageLoop直到DoModal退出都不会返回。

请注意,即使你是模态对话框的消息循环中,你的其他窗口仍然会处理消息,因为GetMessageDispatchMessage仍将检索和直接的信息,以这些窗口和调用它们WndProc秒。

  • @David你应该区分[UI模态和代码模态](https://devblogs.microsoft.com/oldnewthing/20050218-00/?p=36413)。UI 模式对话框不会阻止其他窗口接收窗口消息(否则这些窗口将无法绘制或执行各种其他操作),但这些窗口仍将被禁用,并且不允许用户与它们交互。 (2认同)