当新的应用程序被添加到内存/任务栏时,有没有办法获得一些Windows事件?
我可以通过迭代Process.GetProcesses()来运行应用程序(尽管由于某些原因,浏览器进程将被排除),但这意味着我必须每隔几秒检查一次新进程,这不是很好。
我想知道是否有任何中断我可以在C#应用程序中接收,然后调用该函数来读取进程?
任何代码示例都会很棒 感谢。
答案 0 :(得分:1)
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();
}
答案 1 :(得分:1)
WMI是一种方法。如果在通过P / invoke将代码修改为c#之后没有实现这个想法,如
中所示http://www.codeproject.com/KB/threads/procmon.aspx
祝你好运。
答案 2 :(得分:0)
当然,(不需要WMI),只需使用本机创建事件)
答案 3 :(得分:-1)
This可能有所帮助。由于tnis涉及在NT级别(NtCreateFile()和NtOpenFile()或NtCreateSection())挂钩,我怀疑托管C ++是可行的。