Envoi de message à une application

Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 - 22 juil. 2005 à 22:17
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 24 juil. 2005 à 16:42
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

Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
22 juil. 2005 à 22:55
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() ?
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 juil. 2005 à 23:03
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#
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
22 juil. 2005 à 23:40
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
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 juil. 2005 à 23:53
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#
0

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

Posez votre question
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
22 juil. 2005 à 23:54
Ici il faut naturellement ouvrir winuser.h, pas windows.h :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
23 juil. 2005 à 10:45
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 ?
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
23 juil. 2005 à 12:11
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
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
23 juil. 2005 à 12:43
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
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
23 juil. 2005 à 13:05
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
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 juil. 2005 à 10:06
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#
0
Blacknight91 Messages postés 77 Date d'inscription vendredi 26 mars 2004 Statut Membre Dernière intervention 24 avril 2007 1
24 juil. 2005 à 16:37
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().
0
cs_coq Messages postés 6350 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
24 juil. 2005 à 16:42
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#
0
Rejoignez-nous