Windows MessageBox忽略WM_CLOSE

时间:2013-07-02 13:37:25

标签: c++ c windows event-handling messagebox

我们有一个遗留的C Windows应用程序,当发生致命的连接错误时,它会通过MessageBox调用弹出一个模态窗口。我们的网络工程师可能会同时运行许多这些应用程序。有时,网络故障会导致这些应用程序处理的连接同时失败。

在Windows 7上,从任务栏中选择“关闭所有窗口”功能确实有效,因为模态对话框似乎没有处理WM_QUIT消息。我通常在Linux系统上工作,但我的MSDN研究表明,我能捕获并处理此消息的唯一方法是创建自己的对话框并自己处理消息。

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

2 个答案:

答案 0 :(得分:2)

模态对话框的消息循环应该捕获WM_QUIT并回复调用EndDialog()并使用WM_QUITPostMessage()消息传递到应用程序的主窗口。


<强>更新

如果将WM_QUIT发送到模态对话框,上面提出的方法会起作用... - 但至少在我目前的win7机器上,情况并非如此。

此外,主窗口收到WM_SYSCOMMANDwParam设置为SC_CLOSE,默认情况下,默认消息处理程序会忽略它(这可能是由于模态对话框的风格......?我没有进一步调查过这一点。)。

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

  ...

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

    return DefWindowProc(...);

  ...

答案 1 :(得分:1)

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

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

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

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

相关问题