2016-12-23 13 views
0

基本的に、誰かがタスクマネージャなどで終了タスクをクリックしたときのように、自分のプログラムが終了していることを検出する必要があると、タイトルが言っています。誰かが私にこの事例を扱う何らかのイベントを指摘できますか?任意の助けをありがとう私のWindowsアプリケーションが終了したかどうかを検出するには?

+0

どのようにプログラムを開始しますか?そして、あなたが達成しようとしていることについてより多くの状況情報を私たちにお寄せください。 –

+1

この情報を受け取るプロセスはどれですか?終了しようとしているプロセス、または外部プロセス? – IInspectable

+1

これは何度も尋ねられています。あなたはどんな研究をしましたか? –

答えて

2

このプロセスを開く必要があります。この方法でハンドルを取得します。その後、このハンドルを単に待つことができます。

HANDLE h = OpenProcess(....); 
WaitForSingleObject(h); 

多くの点で、プロセスとスレッドのハンドルは、Windowsイベントハンドルのように見えます。このプロセスまたはスレッドが終了すると、シグナルが通知されます。

+0

askerは、終了中のプロセスでコードを実行しています。だから、これは助けにならないでしょう。 –

+0

まず第一に、これはOPから不明です。第二に、いったんプロセスが終了すると、これまでに開始した情報があるはずです。 AFAIK Windowsは少なくともデフォルトでこのレコードを保持しません。 –

+0

質問が不明な場合は、説明を求めるコメントを投稿する必要があります。 – IInspectable

0

あなたのアプリがどのように終了し、どのタイプのアプリであるかによって異なります。 UIを持つアプリケーションの場合

  • ユーザーがタスクマネージャで「タスクの終了」をクリックすると、あなたが実際にあなたのメッセージハンドラにWM_DESTROYとさえWM_CLOSEメッセージを受信します。
  • ユーザーがアプリのXボタンをクリックするだけであれば、明らかに上記が適用されます。
  • ユーザーがPCからログオフまたはシャットダウンすると、WM_QUERYENDSESSIONおよびWM_ENDSESSIONメッセージが受信されます。

コンソールアプリケーションの場合、SetConsoleCtrlHandler関数を使用して、アプリの終了のほとんどのケースを通知することができます(これは何も経験がないため、詳細はわかりません)。

サービスの場合、同様の方法でRegisterServiceCtrlHandler関数を使用できます。アプリケーションのすべてのタイプの

、アプリはTerminateProcess関数を介して他のプロセスによって強制終了された場合、there is no way to get notified:プロセスはのTerminateProcessで終了した場合

、プロセスのすべてのスレッドが何を直ちに終了されていません追加のコードを実行するチャンス。これは、スレッドが終了ハンドラブロックでコードを実行しないことを意味します。さらに、プロセスが切り離されていることが接続されたDLLには通知されません。

関連する問題