私はメモ帳のようなプロセスの開始時刻を登録する必要があるプログラムを書いています。 毎秒すべてのプロセスをチェックするタイマーを作成するのは良いことだと思っていました。しかし、私はそれがユーザーのコンピュータを遅くすると思う。これを行うより良い方法はありますか?プロセスの開始時刻を登録する最も良い方法は?
答えて
最初に実行中のすべてのプロセスについて、作成時間を決定します。その後、 は、WMIを使用してプロセス作成イベントを登録します。そこWMIとして
私はさらに調査してきたプロセス作成検出:
static void Main(string[] args)
{
using (ManagementEventWatcher eventWatcher =
new ManagementEventWatcher(@"SELECT * FROM
__InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process'"))
{
// Subscribe for process creation notification.
eventWatcher.EventArrived += ProcessStarted_EventArrived;
eventWatcher.Start();
Console.In.ReadLine();
eventWatcher.EventArrived -= ProcessStarted_EventArrived;
eventWatcher.Stop();
}
}
static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject obj = e.NewEvent["TargetInstance"] as ManagementBaseObject;
// The Win32_Process class also contains a CreationDate property.
Console.Out.WriteLine("ProcessName: {0} " + obj.Properties["Name"].Value);
}
EDITをBEGIN:
プロセス作成イベントのためにWMIを使用する方法の簡単な例については、以下のコードを参照してください。 Win32_ProcessStartTrace
クラス(詳しくはTECHNETを参照してください):
using (ManagementEventWatcher eventWatcher =
new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessStartTrace"))
{
// Subscribe for process creation notification.
eventWatcher.EventArrived += ProcessStarted_EventArrived;
eventWatcher.Start();
Console.Out.WriteLine("started");
Console.In.ReadLine();
eventWatcher.EventArrived -= ProcessStarted_EventArrived;
eventWatcher.Stop();
}
static void ProcessStarted_EventArrived(object sender, EventArrivedEventArgs e)
{
Console.Out.WriteLine("ProcessName: {0} "
+ e.NewEvent.Properties["ProcessName"].Value);
}
01(もっと詳しくはこちらをご覧ください) このソリューションでは、ポーリング間隔を設定する必要はありません。
のEND EDIT
はEDIT 2をBEGIN:
あなたは、プロセスの停止イベントを監視するためにWin32_ProcessStopTrace
クラスを使用することができます。プロセス開始イベントとプロセス停止イベントの両方を組み合わせるには、Win32_ProcessTrace
クラスを使用します。イベントハンドラでは、スタート/ストップのイベントを区別するためにClassPath
probertyを使用します。
using (ManagementEventWatcher eventWatcher =
new ManagementEventWatcher(@"SELECT * FROM Win32_ProcessTrace"))
{
eventWatcher.EventArrived += Process_EventArrived;
eventWatcher.Start();
Console.Out.WriteLine("started");
Console.In.ReadLine();
eventWatcher.EventArrived -= Process_EventArrived;
eventWatcher.Stop();
}
static void Process_EventArrived(object sender, EventArrivedEventArgs e)
{
Console.Out.WriteLine(e.NewEvent.ClassPath); // Use class path to distinguish
// between start/stop process events.
Console.Out.WriteLine("ProcessName: {0} "
+ e.NewEvent.Properties["ProcessName"].Value);
}
のEND EDIT 2
-1最初のWMIは内部的にプールします。次に、WMIを使用する必要はありません。 OSはすでにすべてのプロセスの開始時刻を記録しています。あなたがする必要があることはそれを読むことだけです。下の私の答えを見てください。 –
ありがとうございます。クローズプロセスもチェックする方法はありますか? –
@MoctavaFarzán:はい、__InstanceDeletionEventイベントもあります。しかし、__InstanceDeletionEventと__InstanceCreationEventの両方を使用する予定がある場合は、__InstanceOperationEventを登録し、e.NewEvent.ClassPath.ClassNameプロパティを評価してどのイベントが発生したかをチェックインする必要があります。 – Hans
まったく何を監視する必要はありません。プロセスを列挙し、プロセスインスタンスStartTimeからフェッチするだけです。
しかし、あなたは確かにタイマーなどを使用する必要がありますか?一度プロセスを列挙するだけでは不十分です。だから、あなたがなぜ私の答えに投票したのか分からないのですか? – Hans
タイマーなしでそれを達成する方法があります。あなたの答えの主な問題は、 "__InstanceCreationEvent WITHIN 1"を使用すると毎秒ポーリングを行うことです。プロセスが開始し、その時間内に停止した場合は、決して通知を受け取ることはありません。確認したいプロセスがわかっている場合は、イメージファイル実行オプションを使用するときに、OSからコールバックを取得することができます。しかし最初にファザンは、彼が問題のプロセスをどのように得て、彼にとって興味深いのかを述べるべきです。これを達成する方法はたくさんあります。 –
はい、私はaggree。イメージファイルの実行オプション、フック、タイマーを使用したポーリング、WMIの使用、またはドライバの使用など、多くのソリューションがあります。だから、本当にあなたの下票を理解できませんでした。 – Hans
- 1. キャパシティシステムにイベント登録する最も良い方法は?
- 2. jbuttonからスレッドを開始する最も良い方法は?
- 3. start_childコールを開始したプロセスで子プロセスを登録する
- 4. Springブート - デプロイ時にバックグラウンドスレッドを開始する最も良い方法
- 5. SQL - 複数の日付/時刻を記録し、時間差を計算する最も良い方法。
- 6. iPhoneで長い、依存する非同期プロセスを設計して開始する最も良い方法は?
- 7. Funtional方法の開始時刻と終了時刻との
- 8. ユーザーセッションの開始時刻と終了時刻を計算する方法は?
- 9. C#でイベントの開始時刻と終了時刻を処理する最善の方法は何ですか?
- 10. windows/linuxのプロセスの開始時刻を取得しますか?
- 11. angularJsでfullCalendarの開始時刻と終了時刻を取得する方法
- 12. groovy開始時刻と終了時刻を設定する方法
- 13. Swagger仕様で時刻(日付なし)を表す最も良い方法
- 14. kairosdbデータベースの開始時刻と終了時刻の取得方法は?
- 15. 活動を開始/維持する最良の方法は?
- 16. ItemBlockをここに登録するよりも良い方法は?
- 17. 特定の時刻にジョブを開始/停止する方法
- 18. 検索エンジンのログインページのインデックス登録を停止する最も良い方法は何ですか?
- 19. pythonプログラムの開始時刻
- 20. ダウンロードの開始時刻と終了時刻を取得する
- 21. 時刻形式をカスタマイズした場合の開始時刻と終了時刻の比較方法は?
- 22. ニュースレターの登録解除リンクを実装する最も良い方法は何ですか?
- 23. 開始時刻と終了時刻を比較する
- 24. Javaの開始時刻と時刻の間の時間範囲の配列を調べる方法は?
- 25. データファクトリのスライス開始時刻が開始時刻と一致しません
- 26. イベントの開始時刻と終了時刻を他のイベントの開始時刻と終了時刻と比較するには
- 27. プロセス開始時のエラーC0000142
- 28. プロセス開始時のLog4Netエラー
- 29. 開始時にプロセスを中断する方法
- 30. 新しいnodejsプロセスの開始方法
はい、定数ポーリングは多くの理由で間違った解決策であり、パフォーマンスの低下は最小限ではありません。あなたはフックを探しています。しかし、C#でフックDLLを書くことはできません。そのためにCまたはC++のどちらかを使用する必要があります。 –
実際の目標は何ですか?あなたの問題を解決する答えを与えるのは難しいです。プロセスの開始を監視するか、特定のプロセスの開始のみを監視しますか?監視対象プロセスの実行時間を正確に取得する必要があるのか、より長く実行されるプロセスにのみ関心があるのですか。 10分?あなたの答えに応じて、ポーリングは「十分に良い」トレードオフであることが分かります。正確な方法はありますが、これらはかなり複雑です。 –
申し訳ありません、**英語は私にとっては難しいです**。私は、プロセスを実行してtxtファイルに登録する時間を計測したい。しかし私はそれを毎秒点検したくない。 –