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