我们有一个传统的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)正确终止我的应用程序。