新的应用程序被添加到内存/任务栏时,有没有办法获得一些Windows事件?
我可以通过遍历Process.GetProcesses()来运行应用程序(虽然,由于某种原因,explorer进程将被排除),但这意味着我必须每隔几秒检查一次新进程,这不是很好。
我想知道是否有任何中断,我可以在C#应用程序中接收,然后调用函数来读取进程?
任何代码示例将是伟大的。
谢谢。
当一个新的进程被创建时,WMI事件可以提醒你。 根据事件你可能不得不轮询。 使用Win32_ProcessStartTrace类,您不必轮询。 在您的代码中发生新事件作为事件引发。 下面是一个例子(在您的项目中添加System.Management作为参考)
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(); }
当然,(不需要WMI),只需使用本地创建事件)
这可能有帮助。 由于tnis涉及在NT级别(NtCreateFile()和NtOpenFile()或NtCreateSection())挂钩,我怀疑托管C ++的路要走。