Envoi de message à une application

Signaler
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
-
Bonjour,

Ayant parcouru le forum, et n'ayant pas trouvé dans les détails la procédure de ce que je voulais, je pose la question:

Je voudrais controler une application en lui envoyant des messages (simulation d'un appui sur une touche du clavier, clic de souris, ...)
Je n'y connais absolument rien en handle, api et process.
Pourriez vous me décrire avec le plus de précisions possible la marche à suivre pour coder cela ? (je demande pas le code évidemment)

Merci d'avance

12 réponses

Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

Grace à la source de Coq sur INTERNET EXPLORER - RECUPERATION URL, je commence à comprendre un peu mieux les handles + l'envoi des messages.
Par contre, où peut on avoir la liste de tout les messages que l'on peut envoyer avec SendMessage() ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Salut,

Pour ce genre de chose tu auras en général besoin de PostMessage, SendMessage, etc... et de savoir de quelles notications tu dois te servir :

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_RBUTTONDOWN
WM_RBUTTONUP
WM_RBUTTONDBLCLK
WM_MBUTTONDOWN
WM_MBUTTONUP
WM_MBUTTONDBLCLK
...
WM_KEYDOWN
WM_KEYUP
...

Un petit outil incontournable dans ce genre de tâches : Spy++ (fournis avec VS2003)

Pour ce qui est de la récupération des handles des boutons etc, un bon exemple pour s'initier au parcours de la chaine de controles enfants est celui de la récupération de l'url dans la barre d'adresse d'une fenetre IE/Explorer (EnumWindows, FindWindowEx, etc...)
Tu devrais trouver pas mal d'exemples là dessus.

Après il faut souvent adapter au cas par cas.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

merci pour les notifications, mais dans ta source IE/Explorer tu les utilises en constante, dc tu leur attribut une valeur. Ou peut on connaitre la valeur de chaque message ?

J'ai vu ce que pouvait donné Spy++, génial ^^
Je ne connaissais pas l'outil
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Le header est spécifié dans la doc de chaque notification.
ex pour WM_LBUTTONDOWN

Header |
Declared in Winuser.h, include Windows.h

Il suffit d'ouvrir le fichier et de chercher la valeur dedans.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Ici il faut naturellement ouvrir winuser.h, pas windows.h :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

J'ai bien réussi à trouver mes handles de mon application.
Cependant ta méthode RecupHandleCtrl() récupère le 1er handle d'un control.
Mon appli comporte plusieurs controls, et ce n'est pas le 1er qui m'intéresse.
Peut on listé les handles d'un control et ainsi pouvoir choisir celui qui nous interesse ?
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

J'ai réussi tant bien que mal à récupérer le handle que je voulais :)

Une bonne chose.



Ensuite j'envoie un message au handle concerné de mon appli:

SendMessage(handleEdit,WM_KEYDOWN,(int)VK_NUMPAD2,1);



voici ce que Spy++ me log quand j'appuie directement sur la touche numpad2:

<00001> 000407E8 P WM_KEYDOWN nVirtKey:VK_NUMPAD2 cRepeat:1 ScanCode:50 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

<00002> 000407E8 P WM_CHAR chCharCode:'0032' (50) cRepeat:1 ScanCode:50 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

<00003> 000407E8 P WM_KEYUP nVirtKey:VK_NUMPAD2 cRepeat:1 ScanCode:50 fExtended:0 fAltDown:0 fRepeat:1 fUp:1



Et voici ce Spy++ me donne lorsque je lance mon appli simulant l'appui de numpad2:

<00004> 000407E8 S WM_KEYDOWN nVirtKey:VK_NUMPAD2 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

<00005> 000407E8 R WM_KEYDOWN

<00006> 000407E8 S WM_KEYUP nVirtKey:VK_NUMPAD2 cRepeat:1 ScanCode:00 fExtended:0 fAltDown:0 fRepeat:0 fUp:0

<00007> 000407E8 R WM_KEYUP



La simulation d'appui ne m'as rien changer dans le logiciel à controler.

Pourquoi cette différence ?

A quoi correspond les lettres R S P données après le numero de handle ?

Bl@cknight
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

Je viens de trouver, il faut utiliser PostMessage() de l'api.



Sinon pour en revenir à mes handle, ma bidouille n'est pas fiable.

Donc la question est tjr d'actualité: Comment listé tout les handles enfant d'un handle parent ?



Merci

Bl@cknight
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

Encore 2 petites questions (ca commence à en faire là :p)



La touche clavier 'Entrée' à t elle un code spécial ?

Dans winuser.h, VK_RETURN = 0x0D, mais quand je l'applique dans un
PostMessage() j'ai l'impression qu'elle n'est pas utilisé comme je le
voudrais mais en tant que simple caractère.



Dans la msdn de WM_KEYDOWN par ex, comment utiliser le lParam correctement ?

lorsque j'applique une valeur supérieure à 15, il me compte cela quand m comme le nbr de répétition dont la touche est appuyée.



Merci beaucoup pour votre aide

Bl@cknight
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
S : message envoyé
P : message publié
R : retour, "réponse du destinatiare"

Pour l'utilisation de PostMessage c'était marqué dans la doc pourtant :-)
"The WM_KEYDOWN message is posted to the window with the keyboard focus when a nonsystem key is pressed."

Pour l'utilisation du lParam il faut faire un peu de manip sur les bits de ton int (32 bits) :
les bits 0 à 15 permettent de spécifier le nombre de répétitions
etc

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
77
Date d'inscription
vendredi 26 mars 2004
Statut
Membre
Dernière intervention
24 avril 2007

Ok merci pour tes réponses Coq :)

J'ai réussi à lister les handles enfants. Il faut se servir du paramètre hwndChildAfter dans FindWindowEx().
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
92
Oui c'est justement ce qu'on utilise dans l'exemple de récupération de l'url dans IE.

Cocoricoooooooo !!!!
coq
MVP Visual C#