2011-02-05 19 views
11

ありがとう、そこには、Process.GetProcesses()を使用せずにManagementEventWatcherを使用せずに新しいプロセスが開始されたときにイベントを発生させる方法はありますか? ManagementEventWatcherの問題は、ユーザーが高い精度を必要とすることです。 ありがとうございました!C#新しいプロセスが開始されたときにイベントを発生させる

+3

セキュリティモデルを迂回しようとするのではなく、実際にどの問題を解決しようとしているかを教えてください。あなたが考えていないより良い全体的なアプローチがあるかもしれません。 –

+0

私は遊び場に窓を使用するゲーム(Treasure Hunt)を作っています。新しいメモ帳や計算機を開くと、ヒントがプロセスに送られます。次のプロセスが始まるとイベントを発生させる必要があります。宝のためのヒントを送って....私はあなたがそれを得ることを願って.... – user604627

+0

'ManagementEventWatcher'を試しましたか?非常に制限されたユーザーアカウントで試していないことは認めていますが、高い権限が必要だと言う文書には何も表示されません。 –

答えて

9

現在使用している外部イベントWin32_ProcessStartTraceとは異なり、__InstanceCreationEventおよび__InstanceDeletionEventのWMI組み込みイベントには管理者権限が必要ありません。

ここでは、プロセスを追跡するために使用できるサンプルクエリがありますが開始:

SELECT TargetInstance 
    FROM __InstanceCreationEvent WITHIN 1 
WHERE TargetInstance ISA 'Win32_Process' 
    AND TargetInstance.Name LIKE '<your process name.exe>' 

さらに詳細:Process Information and Notifications using WMI

これらは、固有のイベント、ポーリングによって、WMI最終的に模倣イベントの振る舞いであり、チェックしますので新しいイベントの場合は定期的に(ここでは1秒ごとに) WITHINの時間を数分の1秒に短縮すると、CPU使用率を犠牲にして応答速度が向上します。

+5

非常に短いポーリング間隔(たとえば0.1秒)は、プロセス内ではなく最大30%のCPUを消費することができますが、実際のポーリングを実行するWmiPrvSE.exeには注意が必要です。場合は、なぜあなたのプロセスは突然CPUを過ごすことはありませんが、システムプロセスは1つですか? –

0

奇妙なことに、アプリケーションはウィンドウをウィンドウに作成する必要はありません。作成プロセスは、作業中のウィンドウステーションに属していない可能性があります。とにかくそのプロセスのウィンドウを見つける必要があります。また、すべてのプロセスの新規ウィンドウとクローズドウィンドウを検出する必要があります。

したがって、列挙するウィンドウははるかにクリーンで簡単です。

デスクトップハンドル(GetDesktopWindowで検索)のEnumChildWindows機能を試して、アプリケーションのトップレベルウィンドウを見つけてください。得られたハンドルにGetWindowThreadProcessIdEnumThreadWindowsを使用して、ウィンドウのサブウィンドウを検出します。

優先度の低いスレッドがジョブを実行します。

1

Windowsで監査プロセスの追跡を構成することで、アプリケーションが最後にいつ実行されたかを把握することができます。以下のリンクは、あなたが始めるかもしれません:

Audit process tracking

How can I track what programs come and go on my machine?

をプロセス追跡はあなたがC#を使用してアクセスすることができ、Windowsのイベントログにエントリを作成します。

参考:.NET Process Monitor

+0

これは理にかなっており、ポーリングすることなくイベントログの更新を購読できます。http://msdn.microsoft.com/en-us/library/bb671202(v=vs.90).aspx私はあなたに恩恵を授与すると思います。 – Satyajit

+2

オリジナルの質問は別の質問者によって行われていたので、私はあなたの回答を受け入れたものとしてマークすることはできません。 – Satyajit

+0

これは、http://stackoverflow.com/questions/1986249/c-sharp-process-monitor#answer-1986294の逐語的なコピーではありませんか?それは普通のことですか?賞金は[0xA3]に属してはいけません(http://stackoverflow.com/users/40347/0xa3)?? –

0

あなたはおそらく、あなたはすべてのウィンドウハンドルを取得する、user32.dllのからEnumDesktopWindowsを使用することができ、あなたはgetClassNameメソッドを使用してGetWindowTextを使用して、ウィンドウのタイトル、およびウィンドウの種類を確認することができます。

このようにして、ヒントや宝をどこにでも隠すことができます。 (すべてのウィンドウ(およびコントロール)のハンドルを取得するため)。

は、このクラスは、その記事に Managed Global Hook for Window Creation and Destruction

あなたに有用であろうあれば、誰かがイベントを添付するのは簡単で素敵なクラスを作成している、あなたが権限を上昇させずにそのコードを実行することができます参照してください。

ウィンドウ(コントロール)ハンドルを取得したら、ヒントのためにテキストを追加したり、イメージを描画したりすることができます。