Retrouver le focus textuel après un MouseClick

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 50
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Retrouver le focus textuel après un MouseClick

#1

Message par Barthandelus »

Bonjour,

En feuilletant la documentation je n'ai pas trouver ma réponse.
Je possède une infrastructure anti-virus que j'auto-gère via AutoIT. L'une de ses fonctionnalités est le clic automatique (précisément sur mon second écran) à la détection d'une menace lançant un scan automatique (Kaspersky).

Hors voilà ma problématique : Je développe aussi, et à chaque clic, malgré que la fonction MouseMove() me permette de retourner à la position initiale de la souris, la difficulté vient du fait que si je suis en train de saisir du texte (exemple, en écrivant ce sujet, ou sous notepad++, Scite ou autre), je perd le focus, ce qui m'oblige à cliquer à nouveau sur la zone de saisie pour recommencer à taper.

Je souhaiterais donc savoir s'il existe un moyen sous AutoIT de capturer le focus textuel pour le rétablir, afin que l'opération automatisée devienne transparente. Existe-t-il un moyen de mettre ça en place ?

Si non, est-ce que la fonction ControlClick permettrait de résoudre cette problématique (en agissant comme une seconde souris virtuelle, invisible et n'impactant ainsi pas la saisie utilisateur ?) ?

EDIT : Je me permet d'éditer après avoir tester ControlClick.

Tout d'abord je ne dois pas rendre la fenêtre active avec WinActivate(), sinon je perd l'utilité de ControlClick.

Voici mon code :
$hwnd = WinGetHandle("Kaspersky") ; Renvoi une valeur hexadecimal
$u = ControlClick($hwnd, "", "","left", 1, 791, 906) ; Position du bouton à appuyer en partant du principe que x = 0 & y = 0 équivaut au coin supérieur gauche de la fenêtre de Kaspersky, et non de l'écran.
J'effectue une boucle toutes les 3 secondes pour mes tests, mais cela ne fonctionne malheureusement pas :
- Aucun clic lorsque ma souris est en dehors de la fenêtre.
- Lorsque ma souris est sur la fenêtre, le clic s'effectue à l'endroit de la souris, et non ailleurs.

Qu'est ce que je fais de mal ?
rgx
Niveau 3
Niveau 3
Messages : 32
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#2

Message par rgx »

Bonjour Barthandelus,

Peut-être avec la fonction ControlGetFocus en début de script pour mémoriser la position actuelle ?

Je suppose que tu es dans un éditeur, donc il te faudra aussi te repositionner à l’emplacement du curseur et donc la mémoriser aussi ?
La fonction WinGetCaretPos pourrait peut-être convenir ?

PS. Je n'ai pas testé: cela fait quelques années (+10) que je n'ai plus pratiqué AutoIt, je m'y remet doucement :wink:
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 50
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#3

Message par Barthandelus »

@rgx,

Merci pour ta réponse.

J'ai effectuer des tests avec WinGetCaretPos() mais il y avait un différentiel de position (même en suivant la seconde méthode) de la doc. Cependant, avec ControlGetFocus(), ControlFocus() et WinActivate(), j'ai réussi à obtenir ce que je voulais.
$p = ControlGetFocus("[ACTIVE]")
$q = WinGetHandle("[ACTIVE]")

; Clicks ici.

ControlFocus($q, "", $p)
WinActivate($q)
Je ne sais pas si c'est la bonne façon de procéder. A savoir que mon MouseClick() se fait en speed 0. Seul bémol, le temps du MouseClick(), la saisie clavier s'annule, ce qui fait que si je ne le vois pas, je peux par exemple être amener à taper un mauvais nom de variable ($test => $tst, car la latence fait sauter un caractère si je le tape au moment du clic). Je reconnais que je préférerais que le processus soit transparent pour moi.

Existe-t-il un moyen de supprimer cette latence ? L'option du ControlClick() ou un équivalent pour envoyer un click virtuel à l'application Kaspersky ne serait pas envisageable ? Si oui, une idée de comment ?
rgx
Niveau 3
Niveau 3
Messages : 32
Enregistré le : sam. 16 nov. 2019 17:53
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#4

Message par rgx »

Il faudrait que je me plonge dans les détails d'AutoIt, car il fait peut-être ce que font certains programmes d'automation, à savoir travailler directement en mémoire vidéo (option), ce qui fait un temps de réponse bien plus rapide que la détection sur la sortie écran réelle. (à voir...)

Regarde aussi si tu peux valider par un raccourci clavier, ce qui est toujours plus rapide que les actions souris.

Alternative (mais moins fun et pas toujours possible): la plupart des antivirus ont une action par défaut pour les fenêtres de dialogue qui peut s’exécuter au bout de quelques secondes sans réponse.
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 50
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#5

Message par Barthandelus »

Malheureusement ce n'est pas le cas ici. :?

En attendant de savoir s'il est possible d'envoyer un clic à un processus spécifique sans impacter le déplacement et le focus réel de la souris (objectif du thread), j'ai une autre problématique lié à mon code.

Je désactive les contrôles utilisateurs le temps de l'action (via BlockInput($BI_DISABLE)) avant mes actions (MouseClick, MouseMove, ControlFocus) puis je les ré-active (via BlockInput($BI_ENABLE)) tout en ayant inclut <AutoItConstants.au3>, hors, le blocage ne semble pas le faire. Pendant mes 3 actions, je peux continuer de bouger la souris, ce qui fait que je n'appuie pas sur le bouton nécessaire de ma supervision Kaspersky, si au moment de l'action, je bougeais ma souris. Je précise que j'ai bien le RequireAdmin, et que je tourne sous Windows 10.

Une idée de pourquoi ?
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 857
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#6

Message par walkson »

Bonjour,
Je viens de tester sur virtualbox et ni la souris ni le clavier ne sont bloqués.
Par contre, avec ce code, https://www.autoitscript.com/forum/topi ... ckinputex/, clavier et souris sont bloqués
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
Avatar du membre
Barthandelus
Niveau 4
Niveau 4
Messages : 50
Enregistré le : mer. 02 janv. 2019 14:34
Status : Hors ligne

Re: Retrouver le focus textuel après un MouseClick

#7

Message par Barthandelus »

Tout fonctionne avec cet UDF, merci @walkson.

Il ne me reste donc plus qu'une question et la plus important : Autoit est-il capable d'envoyer un click à un processus en arrière plan en fonction des coordonnées de la fenêtre ? Tout en sachant que le Control ne semble pas accessible via Autoit (ce qui en soit n'est pas étonnant, pour Kaspersky).
Répondre