Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 拦截WM_CLOSE进行清理操作_C++_Winapi_Exit_Termination - Fatal编程技术网

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次检查一次,或者其他什么,这样你就不会对性能造成太大影响)。这样你就不需要更改控制流。尝试过了。效果很好!我已经运行了一个循环,所以它只需要很少的更改。最重要的是,它不需要隐藏窗口。