我们有一个遗留的C Windows应用程序,当发生致命连接错误时,它会通过MessageBox调用弹出一个模式窗口。我们的网络工程师可能同时运行许多这样的应用程序。偶尔,网络故障会导致这些应用程序处理的连接同时失败。
在Windows 7上,从任务栏中选择"关闭所有窗口"功能确实有效,因为模式对话框似乎没有处理WM_QUIT消息。我通常在Linux系统上工作,但我的MSDN研究表明,我捕捉和处理此消息的唯一方法是创建自己的对话框并自己处理消息。
我担心的是,我忽略了一个更简单的解决方案,有人能提供替代方案吗?
模式对话的消息循环应该捕获WM_QUIT
,并在响应中调用EndDialog()
,并使用PostMessage()
将WM_QUIT
消息传递到应用程序的主窗口。
更新:
如果向模态对话发送WM_QUIT
,则上述方法将起作用…-但至少在我目前的win7机器上,情况并非如此。
此外,主窗口接收一个WM_SYSCOMMAND
,wParam
设置为SC_CLOSE
,而默认消息处理程序不知何故忽略了它(这可能是由于模态对话框的样式…?我没有对此进行进一步研究。)
但是,将以下分支添加到main窗口的消息循环的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)正确终止了我的应用程序。