Comment surveiller qu’une application est ouverte?

Je mets en œuvre une application d’parsing de bureau qui doit enregistrer les noms et les heures des programmes qu’un utilisateur ouvre sur le PC. Il s’agit d’une application C # (WPF) qui démarre lorsque l’utilisateur ouvre une session et s’exécute sans interface utilisateur. Pour les programmes tels que Word ou IE, il capturerait également quel document ou URL ils consultent.

Actuellement, j’ai une solution de travail comme suit:

Installez un crochet Windows pour la souris. Lorsque cet événement se déclenche, j’utilise p-Invoke pour “GetForegroundWindow”, puis utilise le handle de fenêtre pour “GetWindowThreadProcessId”, avec ProcessId Je peux obtenir l’object System.Diagnostics.Process contenant le nom, l’heure de début et la liste de démarrage des arguments. Je conserve une liste d’historique, donc je n’écris une entrée de suivi que si cette combinaison processId / handle de fenêtre n’a pas encore été enregistrée.

Cette solution fonctionne correctement, mais nécessite le pointage de la souris qui peut être supprimé par Windows sans aucune notification ou la possibilité de vérifier si elle est toujours connectée. Sans parler de cette implémentation semble être un hack.

S’il existe une approche plus simple, veuillez nous en informer.

Merci.

Vous pouvez utiliser l’événement __InstanceCreationEvent et la classe WMI Win32_Process pour surveiller les processus créés.

Essayez cet exemple d’application C #

 using System; using System.Collections.Generic; using System.Management; using System.Text; namespace GetWMI_Info { public class EventWatcherAsync { private void WmiEventHandler(object sender, EventArrivedEventArgs e) { //in this point the new events arrives //you can access to any property of the Win32_Process class Console.WriteLine("TargetInstance.Handle : " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Handle"]); Console.WriteLine("TargetInstance.Name : " + ((ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value)["Name"]); } public EventWatcherAsync() { try { ssortingng ComputerName = "localhost"; ssortingng WmiQuery; ManagementEventWatcher Watcher; ManagementScope Scope; Scope = new ManagementScope(Ssortingng.Format("\\\\{0}\\root\\CIMV2", ComputerName), null); Scope.Connect(); WmiQuery ="Select * From __InstanceCreationEvent Within 1 "+ "Where TargetInstance ISA 'Win32_Process' "; Watcher = new ManagementEventWatcher(Scope, new EventQuery(WmiQuery)); Watcher.EventArrived += new EventArrivedEventHandler(this.WmiEventHandler); Watcher.Start(); Console.Read(); Watcher.Stop(); } catch (Exception e) { Console.WriteLine("Exception {0} Trace {1}", e.Message, e.StackTrace); } } public static void Main(ssortingng[] args) { Console.WriteLine("Listening process creation, Press Enter to exit"); EventWatcherAsync eventWatcher = new EventWatcherAsync(); Console.Read(); } } } 

Si vous souhaitez surveiller les performances de tout ce qui s’exécute sous Windows, la classe PerformanceCounter est la solution. Chaque fois qu’une application démarre Windows, des dizaines de compteurs de performance sont créés pour suivre le ProcessID, l’utilisation du processeur, l’utilisation de la mémoire, les opérations d’E / S par seconde, etc. de l’application.

Par exemple, le code suivant vous donnerait l’ID de processus de Chrome:

 PerformanceCounter perf = new PerformanceCounter("Process", "ID Process", "chrome"); int procId = (int)perf.NextValue(); 

Et vous pouvez également énumérer facilement les catégories, les instances et les compteurs à l’aide de la classe PerformanceCounterCategory .

Vous pouvez utiliser l’outil PerfMon de Windows pour avoir une idée des informations que vous pourrez récupérer. Je vous suggère de regarder la catégorie de processus (à l’aide de PerfMon), dans laquelle vous trouverez une liste de tous les processus actifs.