2

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

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

4

4 回答 4

4

控制台应用程序的官方解决方案是HandlerRoutine,由SetConsoleCtrlHandler. 如果退出,Windows 将使用CTRL_CLOSE_EVENT参数调用您的处理程序。WM_CLOSE

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

于 2012-01-02T10:11:39.347 回答
2

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

于 2012-01-02T08:46:39.280 回答
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

于 2012-01-02T08:48:12.903 回答
1

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

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

这个函数应该用来检查是否已经发布了 WM_CLOSE 消息。它不是阻塞的,您需要定期调用它。

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

于 2012-01-03T10:53:09.853 回答