[R] WinWait et loop

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

[R] WinWait et loop

#1

Message par ganesa2242 »

Bonjour,

je m'en remets à vos compétences, les miennes en langage de script étant fortement limitées.
Je souhaite faire un script qui aurait la fonction suivante:

Lorsque je suis sur la page d'un site Internet spécifique (Termium) et que j'appuie sur une touche (dans mon script ctrl+0, mais ça pourrait être autre chose), alors le script doit automatiquement me remettre en haut de page, placer le curseur de la souris dans un champ précis et sélectionner (avec ctrl+a) le contenu de ce champ. Je souhaite que ce script, une fois exécuté, se remette en attente et qu'il s'exécute la prochaine fois que je rappuierai sur ctrl+0 sur cette même page Termium. Il restera en attente tant que je ne fermerai pas le script manuellement.

Concernant le nom de la fenêtre, il peut varier, mais il contiendra toujours TERMIUM Plus®. Par exemple, si je recherche le mot test (http://www.btb.termiumplus.gc.ca/tpv2al ... resultrecs) le titre de la fenêtre sera : test [26 fiches] - TERMIUM Plus® — Recherche - TERMIUM Plus®

J'ai fait le script ci-dessous. Oui mais voilà, rien ne se passe quand je suis sur la fenêtre Termium. Je ne sais donc même pas par où commencer pour comprendre mon/mes erreurs. Auriez-vous une idée?

Code : Tout sélectionner

#include <Misc.au3>
While 1
WinWait ("[CLASS:MozillaWindowClass]", "TERMIUM Plus")

Local $hDLL = DllOpen("user32.dll")

If HotKeySet ("^0") Then
Send ("{HOME}")
MouseMove (165, 520)
Send ("^a")
EndIf

DllClose($hDLL)
WEnd
Merci d'avance!
Modifié en dernier par ganesa2242 le mar. 26 janv. 2016 18:30, 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: [..] WinWait et loop

#2

Message par mikell »

Le code ci-dessous fait exactement ce qui est demandé, même si je ne vois pas trop quel est le résultat souhaité (Ctrl+A sélectionne toute la page, pas un champ)

Code : Tout sélectionner

Opt("WinTitleMatchMode", -2)

HotKeySet ("{ESC}", "quitter")
HotKeySet ("^{NUMPAD0}", "fonction")  ; Ctrl+0 (0 du pavé numérique)

While 1
   Sleep(10)
WEnd

Func fonction()
  WinActivate("TERMIUM Plus")
  Send ("{HOME}")
  MouseMove (165, 520)
  Send ("^a")
EndFunc

Func quitter()
  Exit
EndFunc
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] WinWait et loop

#3

Message par jguinch »

@mikell : sauf erreur de ma part, CTRL+A dans un champ de texte a pour effet de sélectionner tout le contenu du champ de texte (j'ai fais le test dans le champ de recherche du forum)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [R] WinWait et loop

#4

Message par ganesa2242 »

Tout d'abord merci mikell ! Je ne serai jamais arrivé à ce résultat !

C'est absolument ce que je voulais. J'ai simplement ajouté MouseClick pour qu'il clique dans le champ avant d'envoyer ctrl+A.

Le résultat souhaité est assez simple. J'utilise ce dictionnaire plusieurs dizaines de fois par jour. La précédente version du site permettait de remettre le curseur de la souris dans le champ de recherche. Avec la nouvelle mouture, il faut remonter en haut de la page et cliquer dans le champ de recherche pour rechercher un nouveau terme.

Petite question bonus: est-ce qu'à votre avis, ce script, du fait qu'il reste allumé en permanence, consommera beaucoup de ressources ?

Merci encore pour votre précieuse 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: [..] WinWait et loop

#5

Message par mikell »

@jguinch
J'avais pas percuté à cause des coorconnées du MouseMove...
Ben j'aurai appris quelque chose :mrgreen:

Sinon le script devrait consommer très peu de ressources grâce au Sleep(10) dans la boucle While qui permet au CPU de souffler

Quelque chose comme ça (par exemple) n'aurait pas été plus simple ?

Code : Tout sélectionner

$text = "chose"

ShellExecute("http://www.btb.termiumplus.gc.ca/tpv2alpha/alpha-fra.html?lang=fra&i=1&srchtxt=" & $text & "&index=alt&codom2nd_wet=1#resultrecs")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [..] WinWait et loop

#6

Message par ganesa2242 »

C'est possible... sauf que je ne comprends pas :)

Si je fais ShellExecute, si j'ai compris la fonction, cela va m'ouvrir une nouvelle fenêtre de mon explorateur pour aller à l'adresse indiquée non? J'aimerais autant éviter, car je devrais fermer ouvrir cette fenêtre à chaque fois. Mais je me trompe peut-être.

Pour revenir au script proposé ce matin, il fonctionne partiellement. La première fois que je fais le raccourci, ça marche pas de problème. Par contre, si j'ai fait défiler ma page, puis que je retourne dans un autre logiciel pour travailler, puis reviens sur la page Termium pour chercher un mot, la souris se déplace de manière aléatoire (souvent vers le bas) et ne se place donc pas dans le champ de recherche. Je ne comprends pas pourquoi. Je pense que Send ("{HOME}") n'est pas toujours pris en compte. Est-ce qu'il existe à votre connaissance une commande me permettant de remonter en haut de page ?
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] WinWait et loop

#7

Message par parazitenew »

Bonjour,

Les fonction de la souris que tu utilises sont fonction de l'écran. Si tu demandes à la souris d'aller aux coordonnées X,Y ce seront celles de l'écran et non de la page web.

Si tu veux utiliser les contrôles d'une page web (champ de saisi, bouton etc.) tourne toi vers la bibliothèque IE.au3 (Ceci implique que le site doit être ouvert dans Internet Explorer)
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [..] WinWait et loop

#8

Message par ganesa2242 »

Bonjour,

merci pour ta réponse. Sachant que j'utilise Firefox, je ne sais pas si cette bibliothèque me sera utile. Cependant, même si les fonctions dépendent de l'écran, dans la mesure où je suis sur la page Termium et que je demande d'envoyer Home, je ne comprends pas pourquoi cela ne fonctionne pas. La partie du script qui consiste à déplacer la souris aux coordonnées en revanche fonctionne systématiquement. Est-ce que cela veut dire qu'il faudrait que je donne le "focus" sur ma page avant d'envoyer l'instruction Home?

D'ailleurs, je viens de voir que si j'exécute le script sur la page de ce forum, il fonctionne alors que je pensais qu'il ne fonctionnait que sur l'onglet Termium. Je crois que quelque chose m'échappe!
Avatar du membre
parazitenew
Niveau 7
Niveau 7
Messages : 310
Enregistré le : sam. 10 déc. 2011 15:08
Localisation : Algerie
Status : Hors ligne

Re: [..] WinWait et loop

#9

Message par parazitenew »

Bonsoir,

Il faudra ouvrir la page dans IE pour la bibliothèque IE.

Ce que je voulais dire, c'est si tu défile ta page vers le bas, le champ de saisi ne sera plus à sa place par rapport à l'écran. Donc au à la 2ème exécution, il est normal que ça ne clique pas au bon endroit.

La solution serait effectivement de remonter la page, mais pour l'instant il n'y a qu'une idée qui me vient, c'est donner le focus à un control qui se trouve en haut de la page mais...il faudra toujours les fonctions IE pour ça.
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] WinWait et loop

#10

Message par orax »

Ou alors, au lieu d'ouvrir IE au complet, on pourrait aussi ouvrir la page dans une GUI avec _IECreateEmbedded.
C'est du vite fait mais c'est pour l'exemple...
#include <GUIConstantsEx.au3>
#include <IE.au3>
#include <WindowsConstants.au3>

Global $oIE = _IECreateEmbedded()
Global $hGui = GUICreate("Embedded Web control Test", 640, 580, _
      (@DesktopWidth - 640) / 2, (@DesktopHeight - 580) / 2, _
      $WS_OVERLAPPEDWINDOW + $WS_CLIPSIBLINGS + $WS_CLIPCHILDREN)
GUICtrlCreateObj($oIE, 10, 10, 600, 660)

GUISetState(@SW_SHOW)

_IENavigate($oIE, "http://www.btb.termiumplus.gc.ca/tpv2alpha/alpha-fra.html?lang=fra&i=1&index=alt&codom2nd_wet=1")

HotKeySet("{ESC}", "quitter")
HotKeySet("^{NUMPAD0}", "fonction") ; Ctrl+0 (0 du pavé numérique)

While 1
   Local $iMsg = GUIGetMsg()
   Select
      Case $iMsg = $GUI_EVENT_CLOSE
         ExitLoop
   EndSelect
WEnd

Func fonction()
   WinActivate($hGui)
   $oFrm_search = _IEGetObjById($oIE, "frm_search")
   $oSearchfield = _IEGetObjById($oIE, "searchfield")
   _IEAction($oSearchfield, "focus")
   $oSearchfield.select() ; ou on pourrait remplacer cette ligne par $oSearchfield.value = ClipGet() pour y placer le contenu du presse-papier
   _IEAction($oFrm_search, "scrollintoview")
EndFunc   ;==>fonction

Func quitter()
   Exit
EndFunc   ;==>quitter
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [..] WinWait et loop

#11

Message par ganesa2242 »

@parazitenew:
c'est si tu défile ta page vers le bas, le champ de saisi ne sera plus à sa place par rapport à l'écran. Donc au à la 2ème exécution, il est normal que ça ne clique pas au bon endroit.
C'est justement ça que je ne comprends pas. Car dans le script, il y a la fonction Send ("{HOME}"). Donc sauf encore si je n'ai pas compris le but de Send, le script devrait envoyer l'équivalent de la touche Home qui normalement ramène en haut de page sur une page Web. Or ce n'est pas toujours le cas.

@orax: j'avoue que cette solution me parait moins pratique car j'ai beaucoup d'outils ouverts pour travailler et je n'ai pas forcément envie d'avoir encore une autre fenêtre ouverte. Mais merci quand même, j'apprécie ton aide!
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] WinWait et loop

#12

Message par orax »

Opt("WinTitleMatchMode", -2)

HotKeySet("{ESC}", "quitter")
HotKeySet("^{NUMPAD0}", "fonction") ; Ctrl+0 (0 du pavé numérique)

While 1
   Sleep(10)
WEnd

Func fonction()
   $hWin = WinGetHandle("TERMIUM Plus")
   WinActivate($hWin)
   ControlSend($hWin, "", "", "{HOME}")
   Sleep(250)
   MouseClick("primary", 165, 520, 2)
EndFunc   ;==>fonction

Func quitter()
   Exit
EndFunc   ;==>quitter
Si tu tiens à utiliser Firefox, il y a aussi un UDF pour le contrôler mais il faut préalablement installer MozRepl. https://www.autoitscript.com/forum/topi ... v0601b-15/
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [..] WinWait et loop

#13

Message par ganesa2242 »

Merci beaucoup orax! Lorsque j'utilise le raccourci après l'avoir déjà utilisé et changé de fenêtre, cela ne fonctionne pas du premier coup, mais si j'utilise à nouveau le raccourci, alors ça fonctionne, ce qui n'est déjà pas si mal!!

Merci beaucoup à tous pour votre aide et vos conseils!
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [R] WinWait et loop

#14

Message par orax »

Quand j'ai testé ça fonctionnait bien mais c'est souvent problématique avec les Send et MouseClick...

Il faudrait remplacer MouseClick par ControlClick pour de meilleurs résultats.

Code : Tout sélectionner

   Sleep(500) ; et peut-être augmenter le Sleep()
	ControlClick($hWin, "", "", "primary", 2,165, 520 - 20)
Le - 20 n'est peut-être pas nécessaire mais dans mon cas j'ai dû l'ajouter (ça correspond à la hauteur de la barre de menu).
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [R] WinWait et loop

#15

Message par ganesa2242 »

Je vais tester ça aujourd'hui merci beaucoup! Pour l'ajuster à mon cas, j'ai remplacé ainsi

Code : Tout sélectionner

Sleep(500)
        ControlClick($hWin, "", "", "left", 2,165, 520)
Mais je pense que le problème est en amont, car c'est plutôt la fonction ControlSend home qui me parait aléatoire. En effet, à la première utilisation du raccourci, la fenêtre défile vers le bas, et non vers le haut. A la deuxième utilisation du raccourci, alors tout rentre dans l'ordre!
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] WinWait et loop

#16

Message par mikell »

De toute façon, piloter Firefox à coups de Send et de Mouse* sera toujours aléatoire/problématique
La seule solution réellement fiable est celle proposée précédemment par orax et parazitenew avec les fonctions _IE*
On y vient généralement quand on en a marre de ramer avec un code qui marche 1 fois sur 2 :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [R] WinWait et loop

#17

Message par ganesa2242 »

Et est-ce que Chrome est considéré comme IE? Ou est-ce que IE c'est IE point barre?
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [R] WinWait et loop

#18

Message par mikell »

Si tu choisis cette option (par exemple le genre de code qu'orax montre dans le post #10) c'est effectivement IE point barre, pour pouvoir utiliser la ribambelle de fonctions disponibles dans l'UDF _IE.au3
Note bien que dans ce cas IE n'est utilisé que pour le fonctionnement du script - sans autre engagement :mrgreen:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
ganesa2242
Niveau 2
Niveau 2
Messages : 16
Enregistré le : mer. 22 oct. 2008 09:58
Status : Hors ligne

Re: [R] WinWait et loop

#19

Message par ganesa2242 »

La note est importante :)
Je crois que je vais me contenter du fonctionnement aléatoire qui me dépanne déjà beaucoup!

Je vous remercie TOUS pour votre précieuse aide!
Répondre