none
Détecter un lancement/fermeture de processus en temps réel RRS feed

  • Question

  • Bonjour,

    Je cherche à détecter le lancement et la fermeture de processus sur ma machine, en temps réel. J'ai déjà réalisé un petit prototype fonctionnel basé sur un timer qui tient à jour une liste de processus actifs mais cela est relativement lent et très peu optimisé.

    J'ai recherché un hook permettant de le faire mais je n'ai rien trouvé de concluant.

    Auriez-vous une idée ? Un conseil ? Une piste où je pourrais chercher ?

    Merci d'avance :)

    ps: Je travail en C# avec le .NET framework 3.5 sous visual studio 2008.
    samedi 9 mai 2009 13:31

Réponses

  • J'avais aussi posté sur le forum US de msdn, et j'ai eu ma réponse :). C'est effectivement avec WMI et la classe Win32_ProcessTrace. Voici un exemple de code
    using System;
    using System.Management;
    
    class Process {
      public static void Main() {
        ManagementEventWatcher startWatch = new ManagementEventWatcher(
          new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
        startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived);
        startWatch.Start();
        ManagementEventWatcher stopWatch = new ManagementEventWatcher(
          new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
        stopWatch.EventArrived += new EventArrivedEventHandler(stopWatch_EventArrived);
        stopWatch.Start();
        Console.WriteLine("Press ENTER to exit");
        Console.ReadLine();
        startWatch.Stop();
        stopWatch.Stop();
      }
    
      static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) {
        Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value);
      }
    
      static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) {
        Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value);
      }
    }
    
    • Marqué comme réponse ThitoO dimanche 10 mai 2009 13:27
    dimanche 10 mai 2009 13:27

Toutes les réponses

  • bonsoir,

    Le processus est toujours le même ou il est changeant ?
    il y a peux etre un truc a faire, mais je m'en suis jamais servis, le truc est attaché le programme a un processus ...
    il y a aussi WMI win32_process
    dans tout les cas si c'est du temps réél il faudra utiliser un thread !

    je ferais en VB .net 2008 un exemple qui faudra mettre en C#

    A bientot



    Cordialement, Troxsa
    samedi 9 mai 2009 18:40
  • En fait c'est n'importe quel processus, j'aimerai avoir un genre d'événement au lancement et à la fermeture de n'importe quel processus sur la machine.

    J'ai déjà lu quelques trucs sur WMI mais je n'ai pas tout à fait saisie (je suis débutant en C#, ayant déjà fait du java durant un an je ne pensai pas que le C# me poserai tant de problèmes).

    Merci de ta réponse TroWsa, je vais essayer de chercher plus en détail sur WMI.

    Je suis évidement toujours preneur pour les autres idées :)

    Merci beaucoup
    samedi 9 mai 2009 23:05
  • J'avais aussi posté sur le forum US de msdn, et j'ai eu ma réponse :). C'est effectivement avec WMI et la classe Win32_ProcessTrace. Voici un exemple de code
    using System;
    using System.Management;
    
    class Process {
      public static void Main() {
        ManagementEventWatcher startWatch = new ManagementEventWatcher(
          new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));
        startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived);
        startWatch.Start();
        ManagementEventWatcher stopWatch = new ManagementEventWatcher(
          new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace"));
        stopWatch.EventArrived += new EventArrivedEventHandler(stopWatch_EventArrived);
        stopWatch.Start();
        Console.WriteLine("Press ENTER to exit");
        Console.ReadLine();
        startWatch.Stop();
        stopWatch.Stop();
      }
    
      static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) {
        Console.WriteLine("Process stopped: {0}", e.NewEvent.Properties["ProcessName"].Value);
      }
    
      static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) {
        Console.WriteLine("Process started: {0}", e.NewEvent.Properties["ProcessName"].Value);
      }
    }
    
    • Marqué comme réponse ThitoO dimanche 10 mai 2009 13:27
    dimanche 10 mai 2009 13:27