Winapi 模态对话框';s消息泵是否与主应用程序消息泵交互?

Winapi 模态对话框';s消息泵是否与主应用程序消息泵交互?,winapi,mfc,Winapi,Mfc,我的理解是,任何模式对话框都自动有自己的消息泵,运行在专用于该对话框的线程上-是这样吗 如果是这样,模态对话框的存在如何影响主应用程序的消息循环?两者是否并行运行,是否有一个优先 我遇到过这样一种情况:模式对话框似乎在等待某件事情时被卡住了几秒钟,不知道是否有可能该对话框被强制等待,直到主应用程序线程不忙?正如IInspectable所解释的,模式对话框将与调用者在同一线程中运行。因此,如果从包含主消息循环的主UI线程运行该对话框,那么最终将得到一个嵌套的消息循环。堆栈的外观如下所示: WinM

我的理解是,任何模式对话框都自动有自己的消息泵,运行在专用于该对话框的线程上-是这样吗

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


我遇到过这样一种情况:模式对话框似乎在等待某件事情时被卡住了几秒钟,不知道是否有可能该对话框被强制等待,直到主应用程序线程不忙?

正如IInspectable所解释的,模式对话框将与调用者在同一线程中运行。因此,如果从包含主消息循环的主UI线程运行该对话框,那么最终将得到一个嵌套的消息循环。堆栈的外观如下所示:

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


请注意,即使您在模式对话框的消息循环中,您的其他窗口仍将处理消息,因为
GetMessage
DispatchMessage
仍将检索消息并将其定向到这些窗口,并调用它们的
WndProc
s。它们在同一线程上运行。模式对话框生成一个嵌套的消息循环。嵌套的消息循环和主应用程序的消息循环(或者更确切地说是消息处理程序)都是犯罪中的连体双胞胎:如果一个不遵守规则,另一个也会受到影响。那么调用线程的消息循环是否仍然正常运行,或者是否以某种方式被挂起?只涉及一个线程。当模式对话框的嵌套消息循环运行时,它将分派所有传入的消息。如果对话框执行的操作导致向主应用程序发送要处理的消息,则在消息处理程序完成之前,该调用不会返回。所有消息处理都是序列化的(它在单个线程上运行)-如果消息处理程序需要很长时间才能运行完成,那么该线程上将不会运行其他任何东西。无论是模式对话框还是任何其他应用程序窗口。那么,就像嵌套的while()循环一样,主消息循环只是停止并等待对话框的消息循环终止,然后再继续?当模式对话框处于活动状态时,不会调用主WndProc?“您的其他窗口仍然会收到消息,因为
GetMessage
DispatchMessage
…”,但这些消息是由对话框的消息循环调用的,对吗?基本上,它接管了枯燥的“保持应用程序工作”的工作。@Mr.Boy是的,它们由对话框的消息循环调用。请注意,
GetMessage
DispatchMessage
不知道从哪个消息循环调用它们。这对他们来说都是一样的。如果
GetMessage
DispatchMessage
将消息转发到其他窗口,这是怎样的模式?我认为modal意味着用户必须先与该窗口交互,然后才能与其他UI交互。@David您应该区分两者。UI模式对话框不会阻止其他窗口接收窗口消息(否则这些窗口将无法绘制或执行其他各种操作),但这些窗口仍将被禁用,并且不允许用户与它们交互。在本例中,是否有方法在内部干扰
DoModal
?比如在消息处理过程中添加其他功能,或者让它跳过某种消息?