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();
}
これは、ありがたいことですが、アプリケーションを閉じるときにエラーが出ます - >追加情報:基になるRCWから分離されたCOMオブジェクトは使用できません。 昨夜(よく私のタイムゾーンで:)私はエラーを投げないもう少しのコードで答えを見つけました。 – lopkiju
このエラーを回避するには、WMIオブジェクトを処分する必要があるかもしれないと思います。 –
はい、そうです。 しかし私は1つの問題があります。 ProcessStartTraceとProcessStopTraceのイベントを作成しましたが、MsgBoxを動作させると動作しますが、関数を呼び出してプロセスとリストビューを作成するときには動作しません。 – lopkiju