Windows MessageBox ignoring WM_CLOSE
Windows MessageBox ignoring WM_CLOSE
我们有一个遗留的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)正确终止了我的应用程序。
- ofstream::close() 是否在 Linux 上调用同步?
- 如果我在字符数组上使用 close() 会发生什么?
- "WM" C++是什么意思?
- ZeroMQ 在 context.close() 中被阻止.如何在C++中安全地关闭套接字和上下文?
- 什么是窗口最大化/最小化/恢复的WM Windows消息
- inData.open and inData.close in C++
- 为什么 QQuickWindow->close() 不从 rootObjects 中删除对象?
- 请求X11在C或C++中合成WM的图像
- 如何在OS X上阻止QProgressDialog的'native close button'?
- 对ifstream对象调用close时出现分段错误
- 关闭文件流时出错,其存在取决于与 C++ 中的 .close() 语句相同的布尔值
- QSqlDriver::close使应用程序崩溃
- 确保QSerialPort.close在程序执行完成之前完成
- Qt窗口不会使用其他类的"this->close()"关闭
- 为什么boost shared_ptr包含带有close()的标头
- close和_close,read和_read,write和_write——有什么区别
- 在我的Linux中调用了哪个版本的close(),来自posix lib或内核
- close() 和 closesocket() 可互换
- QFile::flush() vs QFile::close()
- To ::close() or to ::fclose()?