Surveiller le lancement d'un exe

j'ai quelques services qu'une application doit exécuter pour que certaines fonctionnalités de l'application puissent fonctionner. Je voudrais activer l'option démarrer l'externe les services Windows pour initialiser après l'application est lancée. (au lieu de les faire démarrer automatiquement avec la machine et de prendre de la mémoire lorsque l'application n'est pas nécessaire)

Je n'ai pas accès au code de l'exe pour implémenter ceci, donc idéalement je voudrais écrire un service Windows C# .Net ça surveillerait le lancement d'un exe.

ce que j'ai trouvé jusqu'ici, c'est le système.IO.FileSystemEventHandler. Ce composant ne gère que les types d'événements modifiés, créés, supprimés et renommés. Je n'attends pas que le système de fichier du composant serait l'endroit idéal pour trouver ce que je cherche, mais ne savent pas où aller.

peut-être que je ne cherche pas avec les bons mots clés, mais je n'ai pas encore trouvé quelque chose d'extrêmement utile sur Google ou ici sur stackoverflow.com.

la solution serait nécessaire pour fonctionner sur XP, Vista, et Win 7 quand il vient...

Merci d'avance pour tous les pointeurs.

18
demandé sur Michael Petrotta 2009-06-09 04:22:57

5 réponses

cet article, vous pouvez utiliser WMI (le System.Management namespace) dans votre service pour surveiller les événements de démarrage de processus.

 void WaitForProcess()
{
    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();
}

  static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) {
    stopWatch.Stop();
    Console.WriteLine("Process stopped: {0}"
                      , e.NewEvent.Properties["ProcessName"].Value);
  }

  static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) {
    startWatch.Stop();
    Console.WriteLine("Process started: {0}"
                      , e.NewEvent.Properties["ProcessName"].Value);
  }
}

WMI permet des requêtes assez sophistiquées; vous pouvez modifier les requêtes ici pour déclencher votre gestionnaire d'événements seulement lorsque votre application regardée lance, ou sur d'autres critères. Voici une rapide introduction, à partir d'un C# point de vue.

30
répondu Michael Petrotta 2009-06-09 00:37:52

vous avez 3 options ici:

le fiable / intrusif, mettre en place un crochet dans le code non géré qui communique de nouveau à votre c# app chaque fois qu'une application est lancée. Cela est difficile à obtenir droite et implique de charger une DLL supplémentaire avec chaque processus. (Alternativement, vous pouvez configurer un pilote, ce qui est encore plus difficile à écrire)

de la façon la moins fiable, énumérez tous les processus (en utilisant le Système.Diagnostic.Processus classe) sur une base régulière (disons toutes les 10-30 secondes) pour voir si l'application est lancée.

il est également possible de regarder L'événement WMI Win32_Process, InstanceCreationEvent à partir du code géré. Je ne sais pas si c'est fiable, mais je pense que ce serait mieux que des sondages.

4
répondu Sam Saffron 2009-06-09 00:30:06

Moniteur si le processus est en cours d'exécution - un service doit être en cours d'exécution pour ce faire.

si vous ne voulez vraiment pas consommer de ressources - écrivez un service simple en clair C. l'application de Service écrite sans MFC / ATL peut consommer aussi peu que 300-400 Ko de mémoire et virtuellement aucun cycle CPU. Lorsque le processus qui vous intéresse commence, vous pouvez lancer votre C# services.

0
répondu devdimi 2009-06-09 00:35:00
 public Process IsProcessOpen(string name)
        {
            foreach (Process clsProcess in Process.GetProcesses())
                if (clsProcess.ProcessName.Contains(name))
                    return clsProcess;
            return null;
        }
0
répondu lankitha 2012-03-08 11:40:37

en réponse à L'aspect Windows 7 qui ne fonctionne pas. Si vous surveillez des processus 64 bits, votre processus doit aussi être construit pour fonctionner dans l'espace d'adresse 64 bits.

0
répondu Jan S 2013-05-01 20:32:20