2009-03-16 14 views
12

Come si rileva con C# su Windows il momento in cui viene avviata un'applicazione esterna?Rilevamento dell'avvio di un'applicazione

Ho provato il FilesystemWatcher che non funziona perché il file non sta davvero cambiando. Anche avere un timer controlla costantemente tutti i processi aperti potrebbe essere un po 'sopra uccidere. C'è un altro modo di fare questo? Se non in C# è possibile farlo in C++ (se così, per favore, dammi un esempio).

Il motivo per cui desidero farlo è per la registrazione.

risposta

20

È possibile utilizzare System.Management e 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 Come hai fatto a fare questo lavoro? Vari tipi, come MangementEventWatcher, non esistono in System.Management o System.Mangement.Instrumentation. Dove li trovo? Ho dimenticato qualcosa? – Svish

+0

Nevermind. Ho dovuto aggiungere anche un riferimento a System.Management dll. Non solo aggiungere 'usando System.Management;' ... * sigh *: p – Svish

+0

Ma il 'w = new ProcessStartEventArrived (q);' continua a non funzionare ... – Svish