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を処理して、必要なクリーンアップを実行したり、クローズを中止したりすることもできます(0ではなく1を返すことにより)。たとえば、これを参照してください: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 に答える