[R] Comment utiliser GUIRegisterMsg avec un exe externe?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

[R] Comment utiliser GUIRegisterMsg avec un exe externe?

#1

Message par AlBundy »

Bonjour à tous,

Je cherche à utiliser la fonction GUIRegisterMsg sur une application externe.

Code : Tout sélectionner

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
Je me suis inspiré de l'exemple exposé sur la page de la fonction _GUICtrlListView_ClickItem
http://www.autoitscript.com/autoit3/doc ... ckItem.htm

Cette exemple marche très bien avec un GUI créé avec AutoIT mais impossible de le mettre en place pour une application externe.

Savez vous comment je peux détecter les événements d'une application externe en utilisant AutoIT?

Merci d'avance.
Modifié en dernier par AlBundy le ven. 30 sept. 2011 08:32, modifié 1 fois.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#2

Message par mikell »

AlBundy a écrit :Je cherche à utiliser la fonction GUIRegisterMsg sur une application externe.
:?:
Des détails please
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#3

Message par AlBundy »

Merci pour ta réponse,

Mon problème est le suivant:

Je souhaite effectuer un clic sur un item d'une ListView.

Un clic sur cet item ouvre une nouvelle fenêtre.

Pour commencé j'ai utilisé le code suivant:

Code : Tout sélectionner

Local $listview = ControlListView("Appli", "", "SysListView321", "FindItem", "021246423");
Local $handle_listview = ControlGetHandle("Appli", "", "SysListView321");
_GUICtrlListView_SetItemSelected($handle_listview, $listview)
_GUICtrlListView_ClickItem($handle_listview, $listview)
 
mais ce code n'a aucun effet.
Si je commente la ligne _GUICtrlListView_ClickItem($handle_listview, $listview) alors l'item devient bleu comme si il été sélectionne (ce qui je pense doit être le cas).

Pour info, si j'utilise MouseClick("left", X, Y) directement sur l'item je n'ai pas de problème.

En cherchant j'ai compris qu'il faut utiliser GUIRegisterMsg comme dans l'exemple de _GUICtrlListView_ClickItem.
Malheureusement GUIRegisterMsg ne semble marché qu'avec les GUI construit avec AutoIT (GUICreate...)
Je n'arrive pas à le faire fonctionné avec une application externe (une application MFC), du coup impossible de sélectionner mon item.

Savez vous comment utiliser GUIRegisterMsg avec une application qui n'a pas été écrite avec AutoIT (comme le bloc note par exemple) ou bien y'a t'il un autre moyen de faire fonctionner _GUICtrlListView_ClickItem?

Merci d'avance,
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#4

Message par Tlem »

Vous ne pouvez pas capturer les événements interne d'une autre application que la votre par GuiRegisterMsg.

La solution qui se présente à vous, c'est de surveiller les événements visuels (Apparition de boite de dialogue, changement de position, signal sonore, etc ...).

Il me semble qu'il existe aussi une solution avec un hook logiciel, mais très complexe à mettre en œuvre.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#5

Message par AlBundy »

Bonjour Tlem,

Je souhaite cliquer sur l'item mais je n'arrive pas à le faire du coup je ne peut pas tester la présence d'une élément visuel pour confirmer le bon fonctionnement du script.

J'ai commencé à m'inspirer de ce post (qui parle de la soultion du hook) http://www.autoitscript.com/forum/topic ... ntry765675 pour récupérer les événements d'une autre application.

Maintenant j'arrive à récupérer un clic sur un bouton de cette autre application mais pour le clic sur l'item de la listview je n'arrive pas à récupérer l'événement.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#6

Message par Tlem »

Là, comme cela, il va être assez difficile de vous aider sans avoir les éléments sous les yeux.

Essayez d'utiliser 'AutoIt Windows Info' pour avoir des informations sur les différents contrôles sur lesquels vous souhaitez intervenir.
Vous avez aussi l'utilitaire 'Control Viewer' qui est pas mal non plus.

Il existe des sujets similaires à votre question dans le forum. Une bonne recherche devrait vous donner quelques éléments qui pourront vous aider à solutionner votre problème.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#7

Message par mikell »

AlBundy a écrit :Si je commente la ligne _GUICtrlListView_ClickItem($handle_listview, $listview) alors l'item devient bleu comme si il été sélectionne (ce qui je pense doit être le cas).
... si j'utilise MouseClick("left", X, Y) directement sur l'item je n'ai pas de problème.
Et que donnerait la méthode bourrin ?

Code : Tout sélectionner

Local $listview = ControlListView("Appli", "", "SysListView321", "FindItem", "021246423");
Local $handle_listview = ControlGetHandle("Appli", "", "SysListView321");
$pos = _GUICtrlListView_GetItemPosition($handle_listview, $listview)
MouseClick("left", $pos[0], $pos[1])
(avec peut-être un réglage de MouseCoordMode )
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#8

Message par AlBundy »

Avec cette méthode j'obtiens des coordonnées qui positionnent la sourie en haut à gauche de la
fenêtre active.
Quelque soit le "MouseCoordMode" (0, 1 ou 2) j'obtiens toujours les mêmes coordonnées.
En fait il me retourne les coordonnées qui correspondent à la position depuis le coin haut/gauche de l'encadré (la zone) qui contient la listview.
Si j'additionne la position retournée par _GUICtrlListView_GetItemPosition à la position de ce coin relevé par Window Info alors le clic est fait où il faut (position du listview dans la fenêtre + position de l'item dans le listview).

Je dois encore tester la solution pour voir si ça peut coller avec les différents cas que je souhaite automatiser mais c'est la meilleure (et la plus simple) des pistes que j'ai.

Edit:
Existe t'il une solution me permettant d'obtenir directement les bonnes coordonnées?

Merci à toi.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#9

Message par mikell »

AlBundy a écrit :Si j'additionne la position retournée par _GUICtrlListView_GetItemPosition à la position de ce coin relevé par Window Info alors le clic est fait où il faut
Alors peut-être comme ça

Code : Tout sélectionner

$Happli = WinGetHandle("Appli", "")
$handle_listview = ControlGetHandle($Happli, "", "SysListView321")
$LVpos = ControlGetPos($Happli, "", $handle_listview)

$item = ControlListView($Happli, "", "SysListView321", "FindItem", "021246423");
$itempos = _GUICtrlListView_GetItemPosition($handle_listview, $item)
MouseClick("left", $LVpos[0]+$itempos[0], $LVpos[1]+$itempos[1])
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#10

Message par AlBundy »

Avec cette méthode je récupère les coordonnées du control en MouseCoordMode client (2).
Donc en faisant mon clic en passant en Opt("MouseCoordMode",2) je clic presque au bon emplacement.
En fait je clique sur l'item juste au dessus, il manque un chouïa pour que sa marche.
Pour le moment je pense rester avec des coordonnées en dur dans le code pour le control.
Il n'est pas censé bougé donc sa devrait le faire.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#11

Message par mikell »

AlBundy a écrit :En fait je clique sur l'item juste au dessus, il manque un chouïa pour que sa marche.
Si les coords enregistrées sont celles des coins haut-gauche, il suffit peut-être de juste leur rajouter +5 ou +10 (décalage constant) pour que ça marche et que ça clique pile dessus :wink:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
AlBundy
Niveau 1
Niveau 1
Messages : 7
Enregistré le : lun. 17 mai 2010 11:25
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#12

Message par AlBundy »

Oui c'est vrai que c'est plus propre comme ça.

Merci pour ton aide
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Comment utiliser GUIRegisterMsg avec un exe externe

#13

Message par mikell »

Et surtout ça devrait être facilement applicable au clic sur d'autres items Image
Un petit [R] dans le titre du 1er message ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre