Rechercher l’application Windows actuelle

J’essaie d’écrire ce que j’espère être un simple tracker d’application. C’est-à-dire que chaque fois qu’une nouvelle application démarre ou qu’une application en cours d’exécution devient actuelle, je souhaite noter l’événement et commencer à chronométrer le temps “au sumt”.

J’ai un code qui répertorie toutes les applications en cours d’exécution, et un code qui me dit la fenêtre supérieure (toujours mon application de console de test, naturellement).

Ce que je pense être manquant, c’est le stream d’événements Windows à surveiller ou autre.

J’utilise .NET (C # préféré).

Des conseils, astuces ou astuces disponibles?

Merci – Jonathan

Je pense que la meilleure façon de le faire serait d’utiliser Windows “hooks” (par exemple, SetWindowsHookEx ). Celles-ci vous permettent de vous connecter aux fonctionnalités de base de Windows, en particulier il y en a une appelée WH_CALLWNDPROC qui appelle une fonction utilisateur chaque fois qu’une fenêtre du système reçoit un message.

Vous pouvez l’utiliser pour écouter globalement les messages apportant une fenêtre au premier plan et / ou les messages d’interaction utilisateur (souris, clavier).

Cependant, il s’agit d’une fonction API Windows brute principalement destinée à être utilisée dans une DLL Windows C / C ++. Vous pouvez l’implémenter en C #, mais c’est un bidon de vers que vous ne souhaitez peut-être pas ouvrir. Mais l’ouverture serait probablement la meilleure façon de faire ce que vous demandez.

Je ne suis pas sûr qu’il existe un moyen d’accrocher un événement Windows, mais simplement d’interroger System.Diagnostics.Process.GetProcesses () à intervalles réguliers (disons, 100ms) et de rechercher les processus nouveaux / supprimés (par comparaison avec l’ID de processus) le travail. En outre, Process.StartTime vous donnera l’heure à laquelle le processus a commencé.

Avertissement: Cette méthode peut nécessiter un traitement plus important par rapport à une méthode basée sur des événements (dont je ne suis pas au courant). Les processus qui commencent et se terminent entre chaque sondage ne seront pas observés, mais cela devrait être assez rare pour une fréquence de sondage raisonnablement élevée (et vous ne vous souciez peut-être même pas de ces processus). En disant cela, ce sont des inconvénients mineurs, et je vous recommande de tester au moins cette solution car elle est assez simple.

C’est de plus en plus un problème SO, la réponse votée est la bonne. SetWindowsHookEx () est en effet requirejs pour pouvoir attraper le message WM_ACTIVATE que la fenêtre activée reçoit. Mais cela nécessite un hook WH_CALLWNDPROC ou WH_SHELL, des hooks qui ne peuvent pas être implémentés en C #. Catching ceux nécessite d’injecter une DLL dans chaque processus, un assembly géré ne peut pas être injecté dans un autre processus. Le CLR ne peut pas être initialisé.

+1 pour que Noldorin le ramène à 0, c’est tout ce que je peux faire. L’OP doit écrire son code en C / C ++ non géré, en créant une DLL et en utilisant un mécanisme IPC standard tel que des canaux ou des sockets pour notifier l’application hôte. Ou sondage, beaucoup plus facile.

Une fois, j’ai écrit une petite application pour suivre mes propres habitudes de travail. Ce que j’ai fait était d’appeler GetForegroundWindow() périodiquement (toutes les 5 secondes ou quelque chose) et a noté l’application en cours d’exécution. Vous pouvez obtenir beaucoup d’informations à partir du handle de la fenêtre, pas seulement le titre mais jusqu’au processus réel qui l’a créé.

C’est ce que j’ai fait en utilisant la JNA de Java:

 final HWND child = User32Ext.INSTANCE.GetForegroundWindow(); final int length = User32.INSTANCE.GetWindowTextLength(child) * 2; final byte[] buffer = new byte[length]; User32.INSTANCE.GetWindowText(child, buffer, length); title = new Ssortingng(buffer, Charset.forName("UTF-16LE")); 

où User32Ext est une extension que j’ai faite car User32 (dans la dissortingbution de JNA) n’a pas l’interface pour:

 LRESULT callback(int nCode, WPARAM wParam, LPARAM lParam); 

Je scrute périodiquement la fenêtre active, car je ne pouvais pas utiliser le hook HCBT_SETFOCUS comme mentionné dans http://msdn.microsoft.com/en-us/library/ms997537.aspx , et je serais très intéressé si quelqu’un propose la solution.