Событие Windows для нового добавленного приложения в память - PullRequest
4 голосов
/ 25 марта 2009

Есть ли способ получить событие Windows, когда новые приложения добавляются в память / панель задач?
Я могу запустить приложения, перебирая Process.GetProcesses () (хотя процессы обозревателя по какой-то причине будут исключены), но это означает, что мне приходится проверять новые процессы каждые несколько секунд, что не очень хорошо.
Мне было интересно, есть ли какое-либо прерывание, которое я могу получить в приложении C # и затем вызвать функцию для чтения процессов?

Любые примеры кода будут великолепны.
Спасибо.

Ответы [ 4 ]

1 голос
/ 25 марта 2009

WMI - это один из подходов. Если не реализовать идею после изменения кода в c # через P / invoke, как указано в

http://www.codeproject.com/KB/threads/procmon.aspx

Удачи.

1 голос
/ 25 марта 2009

События 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();
}
0 голосов
/ 25 марта 2009

Конечно, (без необходимости WMI), просто используйте собственные события создания)

0 голосов
/ 25 марта 2009

Это может помочь. Поскольку tnis включает в себя перехват на уровне NT (NtCreateFile () и NtOpenFile () или NtCreateSection ()), я бы заподозрил Managed C ++ в качестве пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...