私は自分のアプリケーションを呼び出す外部アプリケーションを持っており、ジョブが完了すると終了するはずです。この外部アプリケーションからのログは、私のアプリでWM_CLOSE
を使用していると主張しています。クリーンアップ操作のインターセプトWM_CLOSE
一部のクリーンアップ操作を行うには、アプリケーションでWM_CLOSE
メッセージを傍受できますか?私はat_exit()
を試してクラスでラッピングしましたが、私は間違ったアプローチをしていると思います。
私は自分のアプリケーションを呼び出す外部アプリケーションを持っており、ジョブが完了すると終了するはずです。この外部アプリケーションからのログは、私のアプリでWM_CLOSE
を使用していると主張しています。クリーンアップ操作のインターセプトWM_CLOSE
一部のクリーンアップ操作を行うには、アプリケーションでWM_CLOSE
メッセージを傍受できますか?私はat_exit()
を試してクラスでラッピングしましたが、私は間違ったアプローチをしていると思います。
メッセージループでWM_CLOSEを処理するだけで、必要なクリーンアップを行うことができます。また、閉じることもできます(0ではなく1を返す)。例えば、この:http://cboard.cprogramming.com/windows-programming/141438-handling-wm_close-wm_destroy.html#post1056273
編集:コンソールアプリケーションのために、これは興味がある可能性がありますhttp://support.microsoft.com/kb/178893
リンクをありがとう、私はそれを隠しウィンドウアプリケーションに変更することに興味があります。私のためのリンクはありますか? –
これは古くなっていますが、「メッセージ処理」のコードは、最小限のアプリケーションで十分であるはずです。http://www.functionx.com/win32/Lesson01b.htm – Piskvor
ご協力いただきありがとうございます。 私は良いチュートリアルを見つけました: http://www.winprog.org/tutorial/ –
winapiを使用して非表示ウィンドウを作成し、そのメッセージループでWM_CLOSEメッセージを処理する必要があります。あなたのアプリはGUI要素を使用していますか?
コンソールアプリケーションはありません。 –
コンソールアプリケーションのための公式のソリューションはHandlerRoutine
、SetConsoleCtrlHandler
によって設定されたコールバックです。 WM_CLOSE
出口の場合、WindowsはハンドブックをCTRL_CLOSE_EVENT
引数で呼び出します。
SetConsoleCtrlHandler
のクラスメソッドを使用する場合は、static
メソッドである必要があります.Windowsはthis
ポインタを提供しません。
追加してくれてありがとうが、私は正常にwinapiアプリケーションに変更しました。 この方法で問題が解決しない場合、私はあなたのアプローチを試みるかもしれません。 –
私が考える最も簡単な方法は、PeekMessageを時折呼び出すことです。
BOOL IsCloseEventReceived()
{
MSG msg;
return PeekMessage(&msg, NULL, WM_CLOSE, WM_CLOSE, PM_NOREMOVE);
}
この関数は、WM_CLOSEメッセージがポストされているかどうかをチェックするために有効です。それはブロックされていない、あなたは定期的にそれを呼び出す必要があります。
私は間違っているかもしれませんが、メッセージを処理するために非表示のウィンドウは必要ないと思うので、PeekMessageのようなメッセージ関連の関数を初めて呼び出すときにメッセージキューがプロセスに追加されます。ただし、この関数の最初の呼び出しの前にWM_CLOSEメッセージを受信した場合、メッセージは失われる可能性があります。
アプリケーションでフレームワークを使用していますか?それにオーバーライドするOnClose関数がありますか? –
他のWindowsメッセージを処理するアプリケーションにメッセージループがありますか? –
いいえ、これまでは唯一のconsolseアプリケーションです。 –