C++ 拦截WM_CLOSE进行清理操作
我有一个调用我的应用程序的外部应用程序,应该在工作完成时结束它。此外部应用程序的日志声称它在我的应用程序上使用了C++ 拦截WM_CLOSE进行清理操作,c++,winapi,exit,termination,C++,Winapi,Exit,Termination,我有一个调用我的应用程序的外部应用程序,应该在工作完成时结束它。此外部应用程序的日志声称它在我的应用程序上使用了WM_CLOSE 如何在我的应用程序中截取WM_CLOSE消息以执行一些清理操作?我尝试在退出()时使用并将其包装到类中,但我认为我的方法是错误的。必须使用winapi创建隐藏窗口,并在其消息循环中处理WM\u CLOSE消息。您的应用程序是否使用任何gui元素?您可以在消息循环中处理WM_CLOSE以执行任何必要的清理,甚至可以中止关闭(通过返回1而不是0)。例如,见: 编辑:对于控
WM_CLOSE
如何在我的应用程序中截取
WM_CLOSE
消息以执行一些清理操作?我尝试在退出()时使用并将其包装到类中,但我认为我的方法是错误的。必须使用winapi创建隐藏窗口,并在其消息循环中处理WM\u CLOSE消息。您的应用程序是否使用任何gui元素?您可以在消息循环中处理WM_CLOSE以执行任何必要的清理,甚至可以中止关闭(通过返回1而不是0)。例如,见:
编辑:对于控制台应用程序,这可能很有趣:控制台应用程序的官方解决方案是,由SetConsoleCtrlHandler
设置的回调。如果出现WM\u CLOSE
退出,Windows将使用CTRL\u CLOSE\u事件
参数调用处理程序
当您将class方法与SetConsoleCtrlHandler
一起使用时,它必须是static
方法-Windows不会为您提供此
指针。我认为最简单的方法是不时调用
BOOL IsCloseEventReceived()
{
MSG msg;
return PeekMessage(&msg, NULL, WM_CLOSE, WM_CLOSE, PM_NOREMOVE);
}
此功能用于检查是否已发布WM_关闭消息。它没有阻塞,您需要定期调用它
我可能错了,但我认为您不需要隐藏窗口来处理消息,在您第一次调用消息相关函数(如PeekMessage)时,消息队列会附加到您的进程。但是,如果您在第一次调用此函数之前收到WM_CLOSE消息,它可能会丢失。您的应用程序中是否使用了某种框架?是否有一个OnClose功能可以覆盖?您的应用程序是否有一个消息循环,您可以在其中处理其他Windows消息?不,到目前为止,它只是一个控制台应用程序。不,它只是一个控制台应用程序。感谢链接,我有兴趣将其更改为隐藏窗口应用程序。你有我的起始链接吗?这是旧的,但是“消息处理”下的代码对于一个最小的应用程序应该足够了:好的,谢谢你的支持。我发现了一个很好的教程:如果您的控制台应用程序是单线程的,那么您必须不时地启动窗口消息循环(调用GetMessage,…),并且每次检查WM_CLOSE是否到达。另一个解决方案是在seprate线程中创建窗口。感谢添加,但我成功地将其更改为winapi应用程序。如果不是这样,我可以试试你的方法。好的,但是我需要做一个循环,每200ms检查一次信号,对吗?是的,或者如果你的代码中已经有一个定期执行的循环,你可以在那里插入它(如果这个地方执行得太频繁,你可能会添加一个计数器,每1000次检查一次,或者其他什么,这样你就不会对性能造成太大影响)。这样你就不需要更改控制流。尝试过了。效果很好!我已经运行了一个循环,所以它只需要很少的更改。最重要的是,它不需要隐藏窗口。