Détection de lancement d'applications [Résolu]

Signaler
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
-
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
-
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

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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;
Messages postés
354
Date d'inscription
mercredi 18 décembre 2002
Statut
Membre
Dernière intervention
24 mars 2011
1
Avec cette clé registretu peux charger une dll maison à chaque lancement de process ... A toi de jouer !

D@runia
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
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.
Messages postés
14982
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
2 mars 2021
94
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...