Windows API プログラミングは初めてです。プロセスがすでに実行されているかどうかを確認する方法があることを認識しています(列挙を介して)。ただし、プロセスの開始時と終了時 (notepad.exe など) をリッスンし、そのプロセスの開始または終了が検出されたときに何らかのアクションを実行する方法があるかどうか疑問に思っていました。限界単位時間ごとに継続的な列挙とチェックループを実行できると思いますが、よりクリーンなソリューションがあるかどうか疑問に思っていました。
5 に答える
WMI、Win32_ProcessStartTrace、および Win32_ProcessStopTrace クラスを使用します。サンプル C# コードはこちらです。
同等の C++ コードを記述する必要があります。ええと、それほどコンパクトではありません。ほとんど定型文です。サバイバル ガイドはこちらから入手できます。
カーネルでコードを実行できる場合は、Windows NT/2K プロセス実行の検出を確認してください。
Hans Passant がおそらく最良の答えを出してくれましたが... C や C++ で書くのは遅く、かなり重いです。
Vista 以下のバージョンの Windows では、WindowsWH_CBT
フックを使用して 95% のカバレッジを得ることができますSetWindowsHookEx
。
いくつかの問題があります:
これにより、実行中の proc のリストを保持し、時々リストの変更をスキャンすることで軽減できるサービスの開始/停止が見逃されます。親/祖父母プロセスとして explorer.exe を持つプロセスをこのリストに保持する必要はありません。Christian Steiber の proc ハンドルのアイデアは、テーブルからの proc の削除を管理するのに適しています。
カーネルによって直接実行されるものを見逃します。これは、#1 と同じ方法で軽減できます。
- フック システム ルールに従わない不適切な動作をするアプリがあり、アプリが通知を見逃す可能性があります。繰り返しますが、これはプロセス テーブルを保持することで軽減できます。
良い点は、かなり軽量で書きやすいことです。
Windows 7 以降については、 を参照してSetWinEventHook
ください。Win7 をカバーするコードを書いていないので、コメントはありません。
プロセスハンドルは、実際には「WaitForMultipleObjects」のような「待機」できるオブジェクトです。
ある種の通知は送信されませんが、MsgWaitForMultipleObjects()バージョンの呼び出しを使用してメッセージ処理と組み合わせると、イベントループの一部としてこれを行うことができます。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion
\Image File Execution Options
ここにプロセス名を含むレジストリ キーを配置し、'Debugger' という名前の REG_SZ とリスナー アプリケーション名を追加して、プロセス開始通知を中継することができます。
残念ながら、私が知っているプロセス終了を受信するためのゼロオーバーヘッドアプローチはありません。