2009-03-25 7 views
4

新しいアプリケーションがメモリ/タスクバーに追加されたときにWindowsイベントを取得する方法はありますか?
Process.GetProcesses()を繰り返し実行すると(何らかの理由でエクスプローラプロセスが除外されますが)実行中のアプリケーションを取得できますが、数秒ごとに新しいプロセスをチェックする必要があります。
私はC#アプリケーションで受け取ることができ、プロセスを読み取る関数を呼び出すことができる割り込みがあるかどうか疑問に思っていましたか?メモリに新規追加されたアプリケーションのWindowsイベント

すべてのコードサンプルは素晴らしいでしょう。
ありがとうございます。

答えて

1

WMIイベントは、新しいプロセスが作成されたときに警告します。イベントに応じて、投票する必要があります。 Win32_ProcessStartTraceクラスを使用すると、ポーリングする必要はありません。新しいイベントは、コード内のイベントとして生成されます。以下の例だけでネイティブの作成イベントを使用し、(必要WMI)、もちろん

public System.Management.ManagementEventWatcher mgmtWtch; 
private delegate void ListBoxItemAdd(string Item); 

public Form1() 
{ 
    InitializeComponent(); 
    mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace"); 
    mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived); 
    mgmtWtch.Start(); 
} 

    void AddItem(string Item) 
    { 
     if (lwProcesses.InvokeRequired) 
      lwProcesses.Invoke(new ListBoxItemAdd(AddItem), Item); 
     else 
      lwProcesses.Items.Add(Item); 
    } 

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e) 
    { 
     //MessageBox.Show((string)e.NewEvent["ProcessName"]); 
     foreach (Process p in Process.GetProcesses(".")) 
     { 
      string Title = p.MainWindowTitle; 
      if (Title.Length > 0) AddItem(Title); 
     } 

    } 

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    mgmtWtch.Stop(); 
} 
+0

これは、ありがたいことですが、アプリケーションを閉じるときにエラーが出ます - >追加情報:基になるRCWから分離されたCOMオブジェクトは使用できません。 昨夜(よく私のタイムゾーンで:)私はエラーを投げないもう少しのコードで答えを見つけました。 – lopkiju

+0

このエラーを回避するには、WMIオブジェクトを処分する必要があるかもしれないと思います。 –

+0

はい、そうです。 しかし私は1つの問題があります。 ProcessStartTraceとProcessStopTraceのイベントを作成しましたが、MsgBoxを動作させると動作しますが、関数を呼び出してプロセスとリストビューを作成するときには動作しません。 – lopkiju

-1

Thisが参考になる場合があります。 tnisはNTレベル(NtCreateFile()とNtOpenFile()、またはNtCreateSection())にフックする必要があるので、Managed C++を使用する方法が疑わしいでしょう。

+0

Managed C++は、カーネルドライバの作成を手助けするつもりはなく、NTネイティブAPIをフックすることは非常に困難で危険です。 – bk1e

+0

誰も言っていませんでした。カーネルドライバを自分で書いたので、NT Apiはユーザモードで、そのZw機能はカーネルモードであることを指摘しておきます。Win32ではなくUserModeの下にあるNT APIのサイト。 –

+0

管理されたC++ DLLをシステムのすべてのプロセスに注入することも悪い考えです。 CLRの異なるバージョンが必要なアプリケーションはどうなりますか?とにかく、あなたがリンクした例は、カーネルモードでフックしています。これはVista 64ビットには移植できません。 – bk1e

0

を(プロジェクトに参照としてSystem.Managementを追加していない))

関連する問題