2012-01-15 16 views
6

私はメモ帳のようなプロセスの開始時刻を登録する必要があるプログラムを書いています。 毎秒すべてのプロセスをチェックするタイマーを作成するのは良いことだと思っていました。しかし、私はそれがユーザーのコンピュータを遅くすると思う。これを行うより良い方法はありますか?プロセスの開始時刻を登録する最も良い方法は?

+1

はい、定数ポーリングは多くの理由で間違った解決策であり、パフォーマンスの低下は最小限ではありません。あなたはフックを探しています。しかし、C#でフックDLLを書くことはできません。そのためにCまたはC++のどちらかを使用する必要があります。 –

+0

実際の目標は何ですか?あなたの問題を解決する答えを与えるのは難しいです。プロセスの開始を監視するか、特定のプロセスの開始のみを監視しますか?監視対象プロセスの実行時間を正確に取得する必要があるのか​​、より長く実行されるプロセスにのみ関心があるのですか。 10分?あなたの答えに応じて、ポーリングは「十分に良い」トレードオフであることが分かります。正確な方法はありますが、これらはかなり複雑です。 –

+0

申し訳ありません、**英語は私にとっては難しいです**。私は、プロセスを実行してtxtファイルに登録する時間を計測したい。しかし私はそれを毎秒点検したくない。 –

答えて

3

最初に実行中のすべてのプロセスについて、作成時間を決定します。その後、 は、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

+0

-1最初のWMIは内部的にプールします。次に、WMIを使用する必要はありません。 OSはすでにすべてのプロセスの開始時刻を記録しています。あなたがする必要があることはそれを読むことだけです。下の私の答えを見てください。 –

+0

ありがとうございます。クローズプロセスもチェックする方法はありますか? –

+1

@MoctavaFarzán:はい、__InstanceDeletionEventイベントもあります。しかし、__InstanceDeletionEventと__InstanceCreationEventの両方を使用する予定がある場合は、__InstanceOperationEventを登録し、e.NewEvent.ClassPath.ClassNameプロパティを評価してどのイベントが発生したかをチェックインする必要があります。 – Hans

2

まったく何を監視する必要はありません。プロセスを列挙し、プロセスインスタンスStartTimeからフェッチするだけです。

+0

しかし、あなたは確かにタイマーなどを使用する必要がありますか?一度プロセスを列挙するだけでは不十分です。だから、あなたがなぜ私の答えに投票したのか分からないのですか? – Hans

+0

タイマーなしでそれを達成する方法があります。あなたの答えの主な問題は、 "__InstanceCreationEvent WITHIN 1"を使用すると毎秒ポーリングを行うことです。プロセスが開始し、その時間内に停止した場合は、決して通知を受け取ることはありません。確認したいプロセスがわかっている場合は、イメージファイル実行オプションを使用するときに、OSからコールバックを取得することができます。しかし最初にファザンは、彼が問題のプロセスをどのように得て、彼にとって興味深いのかを述べるべきです。これを達成する方法はたくさんあります。 –

+0

はい、私はaggree。イメージファイルの実行オプション、フック、タイマーを使用したポーリング、WMIの使用、またはドライバの使用など、多くのソリューションがあります。だから、本当にあなたの下票を理解できませんでした。 – Hans

関連する問題