[..] Envoyer des touches a une fenêtre active via un bouton

Aide sur les Interfaces Graphique Utilisateurs (GUI).
Règles du forum
.
Répondre
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

[..] Envoyer des touches a une fenêtre active via un bouton

#1

Message par jerebou »

Bonjour a tous,

Alors voila c'est assez simple, j'ai une GUI avec 2 boutons, et je souhaite que lors du clic, mon script envoie une combinaison de touches a la dernière fenêtre activée.
Je n'ai aucun souci pour créer la GUI en question mais je ne comprends ps comment indiquer a mon script les infos nécessaires pour arriver jusqu’à la fenêtre qui doit recevoir la combinaison de touches.
Pour être concret, il s'agit d'envoyer un 'Ctrl+w' a Chrome le plus souvent, pour fermer un onglet, sauf que je peux très bien vouloir envoyer un 'ESC' a VLC pour quitter le plein écran si c'est la dernière fenêtre a avoir été active donc pas le script lui-même, vous voyez l'usage en fait, ma GUI a pour but de servir de télécommande. La difficulté pour moi étant de pointer vers la fenêtre souhaitée.
Apres j'aimerais aussi transformer mes boutons de texte en icone, mais une chose a la fois :D

Voila le bout de code:

Code : Tout sélectionner

While 1
  Sleep(10)
  $msg = GUIGetMsg()
  Select
     Case $msg = $GUI_EVENT_CLOSE
       ExitLoop
     Case $msg = $Button1
       MsgBox(0, 'Button 1', 'Button 1 was pressed - closing tab')
       Send("^W")
     Case $msg = $Button2
       MsgBox(0, 'Button 2', 'Button 2 was pressed - escaping the window')
       Send("{ESC}")
    EndSelect
Wend

Merci a vous !
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#2

Message par jbnh »

Voir controlsend()
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#3

Message par jerebou »

Merci mais ça m'aide pas des masses.
J'avais déjà vu ControlSend et ça nécessite de connaitre a l'avance le nom de la dernière fenêtre active, or c'est bien la le problème, c'est quelque chose de dynamique, autrement il me suffirait d'utiliser WinActive et plus besoin d'aide.

Faudrait peut être lire l’énoncé de la question avant de botter en touche...
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#4

Message par jerebou »

Petite mise a jour.

J'ai pense un temps utiliser ce genre de commande pour réactiver la dernière fenêtre mais sans résultat (le focus reste sur la fenêtre de script):

Code : Tout sélectionner

Send("{ALTDOWN}{TAB}{ALTUP}",0)
J'ai trouve ce bout de code qui semble correct mais toujours pas de résultat probant: :(

Code : Tout sélectionner

AutoItSetOption("WinTitleMatchMode", 4)
$activate_last=WinActivate("last")
Quelqu'un peut m'aider svp ?
Y01
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 17 nov. 2014 10:46
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#5

Message par Y01 »

Je pense que tu peux trouver ton bonheur du coté de WinActivate + WinGetHandle.

Sinon pour ton ALT + TAB, essaie :

Code : Tout sélectionner

Send("^+{TAB}")
Y01
Avatar du membre
jbnh
Niveau 11
Niveau 11
Messages : 1932
Enregistré le : ven. 02 mai 2008 14:54
Localisation : Bruxelles
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#6

Message par jbnh »

Une piste :

Code : Tout sélectionner

Send("!{TAB}",0)
$title= WinGetTitle("[ACTIVE]")
msgbox(0,"",$title)
$hWnd = WinGetHandle("");retourne le handle de la fenetre active
suivi d'un controlsend ? :P
Balise [..] devant votre requête en cours, [R] quand résolu | Pas de message concernant les bots !

Merci
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2511
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#7

Message par jguinch »

Sinon, un truc dans ce genre :
► Afficher le texte
... puis un ControlSend :lol:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#8

Message par orax »

Avec GetWindow de l'API Windows :
► Afficher le texte
Source : http://www.whitebyte.info/programming/h ... ive-window
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#9

Message par jerebou »

Merci pour vos réponses :) :)

Ta fonction me plait beaucoup orax, malheureusement le handle de la fenêtre active et celui de son ancêtre sont identiques si j'en crois les 2 MsgBox que j'affiche pour contrôler, ce qui me fait penser que mon script ne parvient pas a retrouver l'historique :(

Par ailleurs je sais que c'est récurrent dans les fonctions donc c'est manifestement juste, mais peut-être peut-on m'expliquer comment il est admis de définir 2 fois une variable ?
Dans ton exemple:

$hr = _WinAPI_GetWindow(WinActive(''), [...]
puis
$hr = _WinAPI_GetAncestor etc
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#10

Message par jerebou »

Et pour toutes les suggestions de simuler un ALT+TAB, ça ne fonctionne pas sous Windows 8, d'ou la bonne idée de passer par une fonction afin de manipuler les fenêtres actives
:) :)
Y01
Niveau 5
Niveau 5
Messages : 160
Enregistré le : lun. 17 nov. 2014 10:46
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#11

Message par Y01 »

Je n'ai personnellement aucun problème à simuler un ALT+TAB sous Windows 8.1 et je doute qu'il y ai une grande différence avec Windows 8.

Concernant ta question sur les variables, tu écrase la valeur de la variable lorsque tu la redéfinie, elle n'a donc qu'une seule valeur quoi qu'il se passe.
Y01
jerebou
Niveau 3
Niveau 3
Messages : 41
Enregistré le : mer. 07 déc. 2011 13:11
Status : Hors ligne

Re: [..] Envoyer des touches a une fenêtre active via un bou

#12

Message par jerebou »

Merci Y01, du reste chez moi rien a faire, 2 postes Windows 8 et un 8.1, aucun ne veut exécuter la partie du code ordonnant un basculement de fenêtres.
En revanche j'ai trouve une fonction tiptop qui permet de contourner ça:

Code : Tout sélectionner

; =======================================
; Function _WinPrevious()
;   Activates a previous window in the z-order.  Only counts visible
;       windows with non-blank titles.
;   Call with:  _WinPrevious([$z])
;       Where:  $z = number of steps back in the z-order (default is 1)
;   On success, returns 1 and activates the previous visible window
;   On failure, returns 0 and sets @error
; =======================================
Func _WinPrevious($z = 1)
    If $z < 1 Then Return SetError(1, 0, 0) ; Bad parameter
    Local $avList = WinList()
    For $n = 1 to $avList[0][0]
        ; Test for non-blank title, and is visible
        If $avList[$n][0] <> "" And BitAND(WinGetState($avList[$n][1]), 2) Then
            If $z Then
                $z -= 1
            Else
                WinActivate($avList[$n][1])
                Return 1
            EndIf
        EndIf
    Next
    Return SetError(2, 0, 0) ; z-depth exceeded
EndFunc
 
Répondre