Utilisation de Spy++

Signaler
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009
-
Messages postés
1
Date d'inscription
samedi 8 août 2009
Statut
Membre
Dernière intervention
8 août 2009
-
Bonjour,
je fais un programme qui devrait automatiser une tâche dans un logiciel. Manuellement, on peut effectuer cette tâche de 2manières:
1- en appuyant sur un bouton d'une barre d'outils
2- en faisant un choix dans un menu

j'essaye d'utiliser Spy++, enfin je le découvre...
j'essaye de sélectionner la plus petite fenêtre, et de bouger tout doux sur la fenêtre, mais je me retrouve toujours avec au moins une centaine de messages captés, et je ne sais pas trop lequel est celui que je cherche.
j'ai même enregistré les messages captés en utilisant les 2manières d'activation, en cherchant une similitude, mais non, je trouve pas!

j'ai besoin de vos conseils !

Merci d'avance!

12 réponses

Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Tu peux filtrer les messages pour ne garder que ceux qui t'intéressent (par exemple virer tous les WM_MOUSEMOVE et compagnie...)
Que veux-tu faire exactement?
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

j'ai essayé de filtrer, j'enlève les messages associé à la souris par exemple, mais là je n'obtiens plus rien... pour le reste je ne sais pas trop ce que c'est, j'essaye à l'aveuglette...
pour le moment je veux capter le code de mon bouton, et le message qui lui est envoyé pour déclencher le processus, pour simuler le click sur ce bouton dans SendMessage.

Pourriez vous me dire ce que signifie "WM_NOTIFY idCtrl:59392 pnmh:0012F9D4" par exemple? et c'est quoi les "S" et "R" qui apparaissent entre le handle et les "WM_..."?

Merci!!!
Messages postés
6
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
28 juillet 2009

Le message WM_NOTIFY correspond à une notification d'un contrôle vers la fenêtre parente. Dans ton exemple, tu as l'ID du contrôle, pnmh devrait correspondre à p_ointer n_otification m_essage h_eader, que l'on utilise dans le traitement du message. S correspond à Send de la fonction SendMessage, R correspond à Return de la fonction SendMessage, dans ce cas il s'agit d'un appel synchrone.

Si j'ai bien compris ton besoin, tu voudrais que le choix d'une option de menu ait la même action que l'appui sur le bouton. La simulation de l'appui sur bouton existe bien, mais tu ne le verras pas avec spy++ puisque la simulation n'est pas en place ! Regarde l'utilisation du message BM_CLICK, à envoyer au bouton par SendMessage.
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

Merci pour les explications alfred2009!!
sinon je crois que t'as pas vraiment compris mon besoin: le choix d'une option du menu, et le bouton raccourci existent déjà tous les 2, dans un logiciel dont je dois automatiser l'exécution.
Donc tu crois que si j'envoie un BM_CLICK au pnmh que j'ai trouvé ça devrait marché?
ce qui me tracasse c'est l'ID du contrôle d'une part, et la notification à envoyer d'autre part....
Messages postés
6
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
28 juillet 2009

Ce que je te suggère, c'est d'envoyer BM_CLICK au contrôle. Dans le gestionnaire de ton menu, tu fais un
::SendMessage( Handle_du_Controle, BM_CLICK, 0, 0 ); // appel Win32

Attention, le pnmh que tu as vu dans spy++ n'est pas à utiliser - réutiliser en dehors de cas précis et pointus, et par celui qui maîtrise l'emission du WM_NOTIFY.
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

Mais c'est effectivement ça qui me bloque: le handle du controle, je ne le connais pas
Les logiciels à gérer sont commercialisés, je n'ai pas leurs codes sources, donc il faut que je me débrouille pour trouver le handle, on m'a conseillé spy++...
tu peux me dire où le trouver exactement?
merci!
Messages postés
6
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
28 juillet 2009

Spy++ va te donner le handle du bouton, mais celui-ci peut/va changer d'une exécution à l'autre.
Tu peux faire ce que fait Spy++ par programme, pourvu que tu aies un moyen de reconnaître la fenêtre principale et le bouton, par leur texte par exemple. Dans ce cas tu énumères les fenêtres actives (cf EnumWindows pour la fenêtre principale, puis EnumChildWindows pour le bouton), cela te donnera les handles de fenêtre.
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

En fait le bouton appartient à une barre d'outils, EnumWindows me donne l'accès à la fenêtre de mon logiciel toto,quoi que le titre est variable mais il est toujours construit suivant la même règle, donc déterminable. EnumChildWindows me donnera l'accès à la barre d'outils fille de toto "Toolbar" contenant mon bouton, mais même spy++ ne détecte pas une fenêtre plus petite que cette barre d'outils... mon bouton a cependant un nom, ça peut aider?
Messages postés
6
Date d'inscription
samedi 18 juillet 2009
Statut
Membre
Dernière intervention
28 juillet 2009

Si Spy++ ne détecte pas de fenêtre, c'est probablement que le bouton n'est pas un contrôle Windows. Dans ce cas, oublie le BM_CLICK et retour à la case départ.

Pour espionner la toolbar, tu peux aussi utiliser l'outil "control spy", disponible sur la MSDN.
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

Si je n'utilise pas le BM_CLICK, comment faire?
Sinon il y a l'autre option: sélectionner une tache dans un menu contextuel, n'est ce pas plus facile??
Messages postés
34
Date d'inscription
jeudi 16 juillet 2009
Statut
Membre
Dernière intervention
25 août 2009

Je crois que j'ai l'id du controle!!
quel message devrais-je lui envoyer?
Messages postés
1
Date d'inscription
samedi 8 août 2009
Statut
Membre
Dernière intervention
8 août 2009

bonjour moi jutilise control spy et je sais pas commen il faut faire pour mettre la cam sans ke la personne le save