Windows MessageBox忽略WM_CLOSE

我们有一个传统的C Windows应用程序,当发生致命的连接错误时,通过MessageBox调用popup一个模式窗口。 我们的networking工程师可能一次运行许多这些应用程序。 偶尔,networking故障会导致这些应用程序处理的连接同时失败。

在Windows 7上,从任务栏中select“closures所有窗口”function确实可行,因为模式对话框似乎没有处理WM_QUIT消息。 我通常在Linux系统上工作,但是我的MSDN研究表明,我可以捕获和处理这个消息的唯一方法是创build我自己的对话框并自己处理消息。

我担心的是,我忽视了一个更简单的解决scheme,任何人都可以提供替代scheme?

模式对话框的消息循环应该捕获WM_QUIT并在响应中调用EndDialog()并使用PostMessage()WM_QUIT消息传递给应用程序的主窗口。


更新:

上面提出的方法是可行的,如果一个WM_QUIT将被发送到模式对话框 – 但至少在我目前的win7机器上,情况并非如此。

此外,主窗口接收WM_SYSCOMMAND并将wParam设置为SC_CLOSE ,默认消息处理程序会忽略它(这可能是由于模式对话框的样式…?我没有进一步调查)。

但是,将下面的分支添加到窗口的消息循环的switch应该在OP描述的条件下完成应用程序的结束工作:

  ... case WM_SYSCOMMAND: if (SC_CLOSE == wParam) { PostQuitMessage(<whatever code shall be returned>); } return DefWindowProc(...); ... 

这可能是一个棘手的问题。

通常,要退出Windows应用程序,必须退出“Windows消息循环”。 最简单的方法是发布退出消息,例如PostQuitMessage(retCode),其中retCode是主消息循环处理程序可以处理的值。 通常,零,即忽略。

通常,PostQuitMessage被发送以响应WM_DESTROY消息。

这真的取决于遗留代码,你有我的同情心,我也处理遗留代码。 我的代码有一个单独的消息循环,并不断显示模态对话框。 调用EndDialog并调用PostQuitMessage(0)正确终止我的应用程序。