Détection de lancement d'applications

Résolu
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 - 14 janv. 2009 à 11:59
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 - 16 janv. 2009 à 21:44
Ami(e)s de la communauté, bonjour!
J'aimerais avoir votre avis sur une question qui me préoccupe en ce moment. Je dois développer un petit composant natif qui retourne, parmi les applications ouvertes sur ma machine, celles qui sont, par exemple, dans une certaine liste blanche, du style:
- Microsoft Excel - MaFiche.xls
- Internet Explorer - CPPFrance.com
...
L'objectif final étant de récupérer le handle des fenêtres des appli "autorisées".

 Mon souci concerne la récupération des applications, ou fenêtres. D'après mes recherches sur le sujet, 2 possibilités s'offrent à moi:
- faire un timer qui récupère la liste des applications ouvertes (par exemple à partir de la source de BruNews) qui m'oblige à faire une différence de liste pour voir les changements
- faire un service, ou driver, qui est notifié à chaque lancement de processus mais qui ne détecte pas les différentes "applications" au sens gestionnaire de tâches

Est-ce quelqu'un s'est déjà confronté à ce problème? Avez-vous des informations à me donner?

Merci d'avance de vos retours.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...

9 réponses

racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
14 janv. 2009 à 22:03
Salut,
Tu peux essayer les fonctions RegisterShellHookWindow(), RegisterWindowMessage() et DeregisterShellHookWindow(). Tu pourras récupérer le message de création de toute nouvelle fenêtre dans la procédure de ta fenêtre ou boite de dialogue qui pourrait être invisible. Exemple:
case WM_INITDIALOG:
    //...
    RegisterShellHookWindow(hwnd);
    break;
case WM_CLOSE:
    //...
    DeregisterShellHookWindow(hwnd);
    break;
default:
    if(message==RegisterWindowMessage("SHELLHOOK"))
    {
       if(wParam==HSHELL_WINDOWCREATED)
       {
          GetWindowText((HWND)lParam,buffer,MAX_PATH);
          MessageBox(hwnd,buffer,"Fenêtre créée",0);
        }
    }
    break;
3
cs_darunia Messages postés 354 Date d'inscription mercredi 18 décembre 2002 Statut Membre Dernière intervention 24 mars 2011 2
14 janv. 2009 à 13:27
Avec cette clé registretu peux charger une dll maison à chaque lancement de process ... A toi de jouer !

D@runia
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
14 janv. 2009 à 16:56
Salut Darunia,
Si je comprends bien, ce que tu veux me dire c'est que je peux créer une dll qui envoie un message à mon appli à chaque démarrage de process utilisant User32.dll, c'est ça?
2 questions:
- peu importe les droits utilisateur?
- c'est au niveau process ou application? Je m'explique. Tu ouvre IE. Sur un lien, tu fais "clic droit > ouvrir dans une nouvelle fenetre". Une autre fenetre se lance. Dans le gestionnaire des tâches, j'ai bien 2 entrées dans l'onglet "Application" mais un seul processus dans l'onglet "Processus".

Ce que je cherche, c'est pouvoir détecter les 2 "applis IE". Est-ce que ta solution répond à cette question?

NB: Pour tous ceux qui lisent ce poste, attention quand vous utilisez cette clé de registre!! Risque de reboot automatique. Oui, je parle par expérience...

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
15 janv. 2009 à 17:30
Salut,
Je pense que j'ai pas dû bien comprendre le principe. Je te dis ce que j'ai compris, dis moi où je me trompe:
Le code que tu me donnes en exemple est à mettre dans mon appli d'écoute.
hwnd est le handle sur ma fenêtre
RegisterShellHookWindow(hwnd) --> me permet d'inscrire ma fenêtre sur la notification de "certains" messages
DeregisterShellWindow(hwnd) --> désabonne ma fenêtre
if (message==RegisterWindowMessage("SHELLHOOK") --> si le message "est" SHELLHOOK

Voici maintenant ma question:
- "certains" messages, "SHELLHOOK" --> il faut que la fenêtre créée envoie un message SHELLHOOK, non? Mais ça, je n'ai pas la main dessus

Je pense que j'ai zappé une étape. Peux-tu m'éclaircir un peu plus, s'il te plaît?

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
15 janv. 2009 à 18:56
Tu as bien compris. Pour répondre à ta question: la fenêtre qui vient d'être créée n'a rien à envoyer. C'est le Shell, disons le système qui s'en occupe. C'est lui qui envoie ce message à ta fenêtre en lui signalant la création, la réduction, la restauration etc d'une fenêtre. A rappeler que tu peux mettre le code dans un service qui interagit avec le bureau.
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
16 janv. 2009 à 16:41
Ok merci, je pense avoir saisi le truc. Du coup, le code que tu m'a filé fait boucler le programme, non?
Je lance mon prog --> OK
Je lance IE --> hop! je catche la création de la fenêtre donc MessageBox
MessageBox --> hop! je catche sa création également
etc...

Le principe du service me plait également... ça t'embêterait de développer un peu cette idée?
@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
16 janv. 2009 à 16:56
Au temps pour moi! Mauvaise bidouille de ma part: j'avais passé NULL au lieu de hwnd dans la MessageBox.
Par contre, je suis toujours intéressé par l'explication du dev sur le service.

@+
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
racpp Messages postés 1910 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 15
16 janv. 2009 à 20:18
Il y'a beaucoup d'exemples de services sur le site. Pour faire interagir un service avec le bureau, le 5ème paramètre de la fonction CreateService() doit être:
SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS
Au démarage du service, une boite de dialogue ou une fenêtre invisible sera créée. Sa procédure captera la notification comme mentionné dans le code plus haut.
0
BunoCS Messages postés 15342 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 26 janvier 2023 103
16 janv. 2009 à 21:44
Effectivement, j'ai eu le temps de trouver des exemples comme celui d'Arnotic ou encore celui de BruNews.
Merci encore racpp de m'avoir aidé.
Dès que j'ai terminé, je posterais ma source: ça pourra ptet aider d'autres personnes.

@+ pour de nouvelles aventures!!
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
Rejoignez-nous