2009-05-16 30 views
1

私のアプリケーションは、システム上の他の実行中のアプリケーションをすべて監視する必要があります。すべてのアプリケーションexeの終了時に通知を受ける方法はありますか?私は見つけることができるWin32:他のアプリケーションの終了/終了の通知メッセージを取得

方法:

1)頻繁な間隔でEXEファイルを実行しているのリストを取得するにはPSAPI関数を使用します。各ポーリングで、前のリストと比較して、どのアプリケーション/プロセスが終了したかを調べます。 短所:一定のポーリングが必要で、CPU時間がかかります。

2)WM_CLOSEメッセージのグローバルフックを設定します。これを使用して、私は、任意のアプリケーションは、タイトルバーの[閉じる]ボタンを通じて

デメリット閉じますときに通知を取得することができるだろう: ( - )必ずしもすべてアプリケーションがWM_CLOSEメッセージを生成しています(例:Total Video Player Exe) 「終了」メニューまたはボタン(たとえば、ファイル→終了)でアプリケーションを終了した場合、そのメッセージをトラップできません。

私が逃した他の良い方法がありますか?お知らせ下さい。

答えて

8
  1. PSAPIを使用してPIDのリストを取得します。
  2. 次に、OpenProcess()を使用して各プロセスのハンドルを取得します。
  3. WaitForMultipleObjects()を使用すると、プロセスの1つが終了したときに通知されます。
+0

WaitForSingleObjectsとWaitForMultipleObjectsの両方に対してERROR_ACCESS_DENIED(0x5)が表示されています。なぜこれが起きているのか、何が間違っているのですか? – armanali

+0

私は推測することができます:あまりにも多くのアクセス権を求めているのでしょうか? SYNCHRONIZEで十分です。ユーザーコンテキストでこのプロセスを監視することができない場合があります(たとえば、シンプルユーザーはシステムプロセスにアクセスできません)。管理ユーザーでも管理者権限が必要です。 –

+0

問題は実際にアクセス許可だったので、あなたは正しいSerge - appTranslatorです。私はPROCESS_ALL_ACCESSフラグを使用しました。 – armanali

2

あなたがHSHELL_WINDOWCREATEDとHSHELL_WINDOWDESTROYEDメッセージ用RegisterShellHookWindow()APIおよびフィルタを試みることができます。

もちろん、ウィンドウを持つアプリケーションについてのみ通知されます。

+0

極端な最後の手段を除いて、グローバルフックの登録は避けます。 –

-1

>私が見逃した他の方法はありますか?

はい、十分です。 Win32 group(システム通知、フックなし)

1

私は最近この問題に遭遇し、皆さんと共有したいソリューションを見つけました。それはすべてのプロセスを処理する方法を修正します。 WaitForSingleObjectの代わりに、私はRegisterWaitForSingleオブジェクト関数を使用することをお勧めします。この関数を使用すると、コールバック関数が与えられ、プロセスが終了するたびにコールバック関数が呼び出されます。これは、スレッドでWaitForSingleObjectを呼び出すよりも優れています。コード内のWaitForSingleObjectを単独で呼び出すと、プロセスが終了するまでコードが待機することになります。ここではそれをコールする方法の例です:

RegisterWaitForSingleObject(&waitHandle, processHandle, ProcessTerminatedCallback, param, INFINITE, WT_EXECUTEONLYONCE); 

: [出] waitHandle - あなたのために作成した新しいハンドル。このハンドルを使用してCloseHandleを呼び出すことはできませんが、望むのであれば待つことができます。

processHandle [中] - あなたが自分で取得することになっているプロセスへのハンドル

ProcessTerminatedCallback [中] - プロセスが終了したときに呼び出されるコールバック関数

のparam [中] - LPVOID INFINITE [中]、コールバック

に渡されるパラメータ - 無限に待つか、指定した時間のため、詳細はMSDNを見てどちらかが

WM_EXECUTEONLYONCE [中] - コールバックのfuを呼び出します一度だけ。 MSDNで詳細を参照してください。

関連する問題