3

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

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

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

4

2 回答 2

3

模态对话的消息循环应该捕获WM_QUIT并响应调用EndDialog()并将WM_QUIT消息传递给应用程序的主窗口PostMessage()


更新:

如果将 a 发送到模态对话,则上述方法将起作用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(...);
   
  ...
于 2013-07-02T18:43:33.593 回答
1

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

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

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

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

于 2013-07-02T17:58:07.877 回答