我有一个外部应用程序调用我的应用程序,并且应该在工作完成后结束它。此外部应用程序的日志声称它WM_CLOSE
在我的应用程序上使用。
如何WM_CLOSE
在我的应用程序中拦截消息以进行一些清理操作?我尝试at_exit()
将它包装在一个类中,但我认为我的方法错误。
我有一个外部应用程序调用我的应用程序,并且应该在工作完成后结束它。此外部应用程序的日志声称它WM_CLOSE
在我的应用程序上使用。
如何WM_CLOSE
在我的应用程序中拦截消息以进行一些清理操作?我尝试at_exit()
将它包装在一个类中,但我认为我的方法错误。
控制台应用程序的官方解决方案是HandlerRoutine
,由SetConsoleCtrlHandler
. 如果退出,Windows 将使用CTRL_CLOSE_EVENT
参数调用您的处理程序。WM_CLOSE
当您使用带有 的类方法时SetConsoleCtrlHandler
,它必须是一个static
方法 - Windows 不会为您提供this
指针。
您必须使用 winapi 创建隐藏窗口,并在其消息循环中处理 WM_CLOSE 消息。您的应用程序是否使用任何 gui 元素?
您可以只在消息循环中处理 WM_CLOSE 以进行任何必要的清理,甚至中止关闭(通过返回 1 而不是 0)。参见例如:http ://cboard.cprogramming.com/windows-programming/141438-handling-wm_close-wm_destroy.html#post1056273
编辑:对于控制台应用程序,这可能很有趣:http: //support.microsoft.com/kb/178893
我认为最简单的方法是不时调用PeekMessage 。
BOOL IsCloseEventReceived()
{
MSG msg;
return PeekMessage(&msg, NULL, WM_CLOSE, WM_CLOSE, PM_NOREMOVE);
}
这个函数应该用来检查是否已经发布了 WM_CLOSE 消息。它不是阻塞的,您需要定期调用它。
我可能错了,但我认为您不需要隐藏窗口来处理消息,当您第一次调用消息相关函数(如 PeekMessage)时,消息队列会附加到您的进程中。但是,如果您在第一次调用此函数之前收到 WM_CLOSE 消息,则它可能会丢失。