2009-03-16 8 views
12

Comment détecter avec C# sous Windows le moment où une application externe est lancée?Détection du lancement d'une application

J'ai essayé le FilesystemWatcher qui ne fonctionne pas parce que le fichier ne change pas vraiment. Avoir aussi une minuterie constamment vérifier tous les processus ouverts pourrait être un peu plus de tuer. Y a-t-un autre moyen de faire ça? Si ce n'est pas en C#, il est possible de le faire en C++ (si c'est le cas, donnez-moi un exemple).

La raison pour laquelle je veux faire cela est pour la consignation.

Répondre

20

Vous pouvez utiliser System.Management et 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 Comment avez-vous ce travail? Divers types, tels que MangementEventWatcher, n'existent pas dans System.Management ou System.Mangement.Instrumentation. Où les trouve-t-on? Ai-je manqué quelque chose? – Svish

+0

Nevermind. J'ai dû ajouter une référence à System.Management dll aussi bien. Pas seulement ajouter 'using System.Management; '... * sigh *: p – Svish

+0

Mais le' w = new ProcessStartEventArrived (q); 'ne fonctionne toujours pas ... – Svish

Questions connexes