2009-03-16 4 views
12

Как определить с помощью C# в Windows момент запуска внешнего приложения?Обнаружение запуска приложения

Я пробовал FilesystemWatcher, который не работает, потому что файл не меняется. Кроме того, таймер постоянно проверяет, что все открытые процессы могут быть немного убиты. Есть ли другой способ сделать это? Если нет в C#, то можно сделать это на C++ (если да, то дайте мне пример).

Причина, по которой я хочу это сделать, предназначена для ведения журнала.

ответ

20

Вы можете использовать System.Management и WMI (Windows Management Instrumentation)

class WMIEvent { 
    public static void Main() { 
     WMIEvent we = new WMIEvent(); 
     ManagementEventWatcher w= null; 
     WqlEventQuery q; 
     try { 
      q = new WqlEventQuery(); 
      q.EventClassName = "Win32_ProcessStartTrace"; 
      w = new ManagementEventWatcher(q); 
      w.EventArrived += new EventArrivedEventHandler(we.ProcessStartEventArrived); 
      w.Start(); 
      Console.ReadLine(); // block main thread for test purposes 
     } 
     finally { 
      w.Stop(); 
     } 
} 

    public void ProcessStartEventArrived(object sender, EventArrivedEventArgs e) {  
     foreach(PropertyData pd in e.NewEvent.Properties) { 
      Console.WriteLine("\n============================= ========="); 
      Console.WriteLine("{0},{1},{2}",pd.Name, pd.Type, pd.Value); 
     } 
    } 
+0

@stalkerh Как вы сделать эту работу? Различные типы, такие как MangementEventWatcher, не существуют в System.Management или System.Mangement.Instrumentation. Где я их найду? Я что-то пропустил? – Svish

+0

Nevermind. Пришлось добавить ссылку на dll System.Management. Не просто добавить 'using System.Management;' ... * sigh *: p – Svish

+0

Но w = new ProcessStartEventArrived (q); 'все еще не работает ... – Svish

Смежные вопросы