Page 1 sur 1
[R] WinWait et loop
Posté : lun. 25 janv. 2016 09:43
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!
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 11:40
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
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 12:25
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)
Re: [R] WinWait et loop
Posté : lun. 25 janv. 2016 12:34
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.
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 15:43
par mikell
@jguinch
J'avais pas percuté à cause des coorconnées du MouseMove...
Ben j'aurai appris quelque chose
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")
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 17:24
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 ?
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 18:03
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)
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 18:24
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!
Re: [..] WinWait et loop
Posté : lun. 25 janv. 2016 22:39
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.
Re: [..] WinWait et loop
Posté : mar. 26 janv. 2016 00:45
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 EndSelectWEndFunc 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 ;==>fonctionFunc quitter
() ExitEndFunc ;==>quitter
Re: [..] WinWait et loop
Posté : mar. 26 janv. 2016 09:13
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!
Re: [..] WinWait et loop
Posté : mar. 26 janv. 2016 14:27
par orax
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/
Re: [..] WinWait et loop
Posté : mar. 26 janv. 2016 18:30
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!
Re: [R] WinWait et loop
Posté : mar. 26 janv. 2016 19:59
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).
Re: [R] WinWait et loop
Posté : mer. 27 janv. 2016 10:20
par ganesa2242
Je vais tester ça aujourd'hui merci beaucoup! Pour l'ajuster à mon cas, j'ai remplacé ainsi
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!
Re: [R] WinWait et loop
Posté : mer. 27 janv. 2016 14:22
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

Re: [R] WinWait et loop
Posté : jeu. 28 janv. 2016 09:46
par ganesa2242
Et est-ce que Chrome est considéré comme IE? Ou est-ce que IE c'est IE point barre?
Re: [R] WinWait et loop
Posté : jeu. 28 janv. 2016 15:17
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

Re: [R] WinWait et loop
Posté : jeu. 28 janv. 2016 17:21
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!