2009-06-09 7 views
17

J'ai quelques services qu'une application doit exécuter pour que certaines fonctionnalités de l'application fonctionnent. Je voudrais activer l'option pour démarrer uniquement les services Windows externes pour initialiser après le lancement de l'application. (par opposition à les faire démarrer automatiquement avec la machine et prendre la mémoire quand l'application n'est pas nécessaire)Surveiller quand un exe est lancé

Je n'ai pas accès au code de l'exe pour implémenter ceci, donc idéalement je voudrais écrire un C# .Net Service Windows qui surveille quand un exe est lancé.

Ce que j'ai trouvé jusqu'à maintenant est le System.IO.FileSystemEventHandler. Ce composant gère uniquement les types d'événements modifiés, créés, supprimés et renommés. Je ne m'attends pas à ce qu'un composant de système de fichiers soit l'endroit idéal pour trouver ce que je cherche, mais je ne sais pas où aller.

Peut-être que je ne recherche 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 Windows 7 quand il vient ...

Merci à l'avance pour tous les pointeurs.

Répondre

26

A partir de this article, vous pouvez utiliser WMI (l'espace de noms System.Management) dans votre service pour surveiller les événements de démarrage du processus. WMI permet des requêtes assez sophistiquées; vous pouvez modifier les requêtes ici pour déclencher votre gestionnaire d'événements uniquement lorsque votre application surveillée est lancée, ou sur d'autres critères. Here's a quick introduction, à partir d'une perspective C#.

+0

Excellente réponse. résolu mon problème. – Stimul8d

+0

Excellent, très utile. À votre santé! – tjjjohnson

+1

Problème lors de l'exécution de ce code sous Windows 7. Je reçois une erreur «accès refusé» lors de l'appel de startWatch.Start(). Est-ce que quelqu'un a trouvé un workaroun pour cela? – tjjjohnson

4

vous avez 3 options:

L'un fiable/intrusif, mettre en place un crochet dans le code non géré qui communique à votre application C# chaque fois qu'une application est lancée. C'est difficile à obtenir et implique le chargement d'une DLL supplémentaire avec chaque processus. (Sinon, vous pouvez configurer un pilote, ce qui est encore plus difficile à écrire)

Le moyen le moins fiable, lister tous les processus (en utilisant la classe System.Diagnostics.Process) sur une base régulière (par exemple toutes les 10-30 secondes) pour voir si l'application est lancée.

Il peut également être possible de regarder l'événement Win32_Process, InstanceCreationEvent WMI à partir du code managé. Je ne sais pas à quel point c'est fiable, mais je soupçonne que ce serait mieux que les processus d'interrogation.

0

Surveillez 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 langage C. L'application de service écrite sans MFC/ATL peut consommer aussi peu que 300-400 kb de mémoire et ne nécessite virtuellement aucun cycle de CPU. Lorsque le processus qui vous intéresse commence, vous pouvez générer vos services C#.

0
public Process IsProcessOpen(string name) 
     { 
      foreach (Process clsProcess in Process.GetProcesses()) 
       if (clsProcess.ProcessName.Contains(name)) 
        return clsProcess; 
      return null; 
     } 
0

En réponse à l'aspect de Windows 7 ne fonctionne pas. Si vous surveillez des processus 64 bits, votre processus doit également être construit pour fonctionner dans l'espace d'adressage 64 bits.

Questions connexes