アプリケーションを呼び出す外部アプリケーションがあり、ジョブが完了するとアプリケーションを終了することになっています。この外部アプリケーションからのログは、それが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を処理して、必要なクリーンアップを実行したり、クローズを中止したりすることもできます(0ではなく1を返すことにより)。たとえば、これを参照してください: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メッセージを受信すると、失われる可能性があります。