拦截WM_CLOSE进行清理操作

时间:2012-01-02 08:41:29

标签: c++ winapi exit termination

我有一个调用我的应用程序的外部应用程序,并且应该在作业完成时结束它。此外部应用程序的日志声称它在我的应用上使用了WM_CLOSE

如何拦截应用程序中的WM_CLOSE消息进行一些清理操作?我尝试at_exit()并将它包装在一个类中,但我认为我的方法不对。

4 个答案:

答案 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消息,则可能会丢失该消息。

相关问题