Windows事件将新添加的应用程序添加到内存中

时间:2009-03-25 02:06:52

标签: windows events memory

当新的应用程序被添加到内存/任务栏时,有没有办法获得一些Windows事件? 我可以通过迭代Process.GetProcesses()来运行应用程序(尽管由于某些原因,浏览器进程将被排除),但这意味着我必须每隔几秒检查一次新进程,这不是很好。
我想知道是否有任何中断我可以在C#应用程序中接收,然后调用该函数来读取进程?

任何代码示例都会很棒 感谢。

4 个答案:

答案 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 ++是可行的。