拦截WM_CLOSE进行清理操作

Intercept WM_CLOSE for cleanup operations

本文关键字:操作 WM CLOSE 拦截      更新时间:2023-10-16

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

我如何在我的应用程序中拦截WM_CLOSE消息来执行一些清理操作?我尝试了at_exit()并将其包装在一个类中,但我认为我有错误的方法。

控制台应用程序的官方解决方案是HandlerRoutine,它是由SetConsoleCtrlHandler设置的回调。在退出WM_CLOSE的情况下,Windows将使用CTRL_CLOSE_EVENT参数调用处理程序。

当你使用SetConsoleCtrlHandler的类方法时,它必须是static方法- Windows不会为你提供this指针。

你可以在你的消息循环中处理WM_CLOSE来做任何清理是必要的,或者甚至中止关闭(通过返回1而不是0),参见如下示例:http://cboard.cprogramming.com/windows-programming/141438-handling-wm_close-wm_destroy.html#post1056273

编辑:对于控制台应用程序,这可能是感兴趣的:http://support.microsoft.com/kb/178893

您必须使用winapi创建隐藏窗口,并在其消息循环中处理WM_CLOSE消息。你的应用是否使用了任何gui元素?

我认为最简单的方法是不时调用PeekMessage。

BOOL IsCloseEventReceived()
{
    MSG msg;
    return PeekMessage(&msg, NULL, WM_CLOSE, WM_CLOSE, PM_NOREMOVE);
}

这个函数应该检查是否有WM_CLOSE消息被发布。它不会阻塞,您需要定期调用它。

我可能错了,但我认为你不需要一个隐藏窗口来处理消息,第一次调用消息相关的函数(如PeekMessage)时,将消息队列附加到进程中。然而,如果你在第一次调用这个函数之前收到一个WM_CLOSE消息,它可能会丢失。