2012-01-02 8 views
2

私は自分のアプリケーションを呼び出す外部アプリケーションを持っており、ジョブが完了すると終了するはずです。この外部アプリケーションからのログは、私のアプリでWM_CLOSEを使用していると主張しています。クリーンアップ操作のインターセプトWM_CLOSE

一部のクリーンアップ操作を行うには、アプリケーションでWM_CLOSEメッセージを傍受できますか?私はat_exit()を試してクラスでラッピングしましたが、私は間違ったアプローチをしていると思います。

+0

アプリケーションでフレームワークを使用していますか?それにオーバーライドするOnClose関数がありますか? –

+1

他のWindowsメッセージを処理するアプリケーションにメッセージループがありますか? –

+0

いいえ、これまでは唯一のconsolseアプリケーションです。 –

答えて

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

+0

リンクをありがとう、私はそれを隠しウィンドウアプリケーションに変更することに興味があります。私のためのリンクはありますか? –

+0

これは古くなっていますが、「メッセージ処理」のコードは、最小限のアプリケーションで十分であるはずです。http://www.functionx.com/win32/Lesson01b.htm – Piskvor

+0

ご協力いただきありがとうございます。 私は良いチュートリアルを見つけました: http://www.winprog.org/tutorial/ –

2

winapiを使用して非表示ウィンドウを作成し、そのメッセージループでWM_CLOSEメッセージを処理する必要があります。あなたのアプリはGUI要素を使用していますか?

+0

コンソールアプリケーションはありません。 –

3

コンソールアプリケーションのための公式のソリューションはHandlerRoutineSetConsoleCtrlHandlerによって設定されたコールバックです。 WM_CLOSE出口の場合、WindowsはハンドブックをCTRL_CLOSE_EVENT引数で呼び出します。

SetConsoleCtrlHandlerのクラスメソッドを使用する場合は、staticメソッドである必要があります.Windowsはthisポインタを提供しません。

+0

追加してくれてありがとうが、私は正常にwinapiアプリケーションに変更しました。 この方法で問題が解決しない場合、私はあなたのアプローチを試みるかもしれません。 –

1

私が考える最も簡単な方法は、PeekMessageを時折呼び出すことです。

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

この関数は、WM_CLOSEメッセージがポストされているかどうかをチェックするために有効です。それはブロックされていない、あなたは定期的にそれを呼び出す必要があります。

私は間違っているかもしれませんが、メッセージを処理するために非表示のウィンドウは必要ないと思うので、PeekMessageのようなメッセージ関連の関数を初めて呼び出すときにメッセージキューがプロセスに追加されます。ただし、この関数の最初の呼び出しの前にWM_CLOSEメッセージを受信した場合、メッセージは失われる可能性があります。

+0

それでは、信号のために毎回200msをチェックするループを作る必要がありますか? –

+0

はい、コードにループがあり、定期的に実行すると、そこに挿入される可能性があります(場所が頻繁に実行された場合は、カウンタを追加して1000回などのチェックを行い、パフォーマンスがあまりにも)。そうすれば、制御フローを変更する必要はありません。 – sashoalm

+1

それを試してみてください。よく働く!私はすでにループを走らせていたので、最小限の変更でフィットしました。何よりも、隠されたウィンドウは必要ありませんでした。 – sep