Page 1 sur 1

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

Posté : mer. 19 nov. 2014 14:42
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 !

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

Posté : jeu. 20 nov. 2014 12:12
par jbnh
Voir controlsend()

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

Posté : jeu. 20 nov. 2014 14:13
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...

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

Posté : jeu. 20 nov. 2014 14:15
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 ?

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

Posté : jeu. 20 nov. 2014 14:32
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}")

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

Posté : jeu. 20 nov. 2014 15:16
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

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

Posté : jeu. 20 nov. 2014 16:08
par jguinch
Sinon, un truc dans ce genre :
► Afficher le texte
... puis un ControlSend :lol:

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

Posté : jeu. 20 nov. 2014 17:13
par orax
Avec GetWindow de l'API Windows :
► Afficher le texte
Source : http://www.whitebyte.info/programming/h ... ive-window

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

Posté : mar. 25 nov. 2014 18:32
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

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

Posté : mar. 25 nov. 2014 19:33
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
:) :)

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

Posté : mer. 26 nov. 2014 08:51
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.

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

Posté : mer. 03 déc. 2014 15:36
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