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
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):
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 :
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 ?

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
Code : Tout sélectionner
Local $hLastActive = WinGetHandle("[ACTIVE]")
AdlibRegister("_WinGetLastActive")
Local $msg, $hGUI = GUICreate("gui"), $ID_button = GUICtrlCreateButton("Clic", 10, 10, 200, 30)
GUISetState()
While 1
$msg = GUIGetMsg()
If $msg = -3 Then Exit
If $msg = $ID_button Then ConsoleWrite($hLastActive & @TAB & WinGetTitle($hLastActive) & @CRLF)
Sleep(10)
WEnd
Func _WinGetLastActive()
Local $hActive = WinGetHandle("[ACTIVE]")
If $hActive = $hGUI OR $hActive = 0 Then Return
$hLastActive = $hActive
EndFunc
... puis un ControlSend

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
Code : Tout sélectionner
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WinAPIConstants.au3>
#include <WindowsConstants.au3>
$h = GUICreate("Radio Box Demo", 400, 280)
; Create the controls
Local $Button1 = GUICtrlCreateButton("B&utton 1", 30, 20, 120, 40)
Local $Button2 = GUICtrlCreateButton("B&utton 2", 180, 20, 120, 40)
GUISetState(@SW_SHOW)
While 1
Sleep(10)
$msg = GUIGetMsg()
Select
Case $msg = $GUI_EVENT_CLOSE
ExitLoop
Case $msg = $Button1
;ControlSend...
;~ MsgBox(0, 'Button 1', 'Button 1 was pressed - closing tab')
_()
Case $msg = $Button2
MsgBox(0, 'Button 2', 'Button 2 was pressed - escaping the window')
EndSelect
WEnd
Func _()
$hr = _WinAPI_GetWindow(WinActive(''), $GW_HWNDNEXT)
If @error Then
ConsoleWrite(_WinAPI_GetLastErrorMessage() & @CRLF)
Exit -1
EndIf
$hr = _WinAPI_GetAncestor($hr, $GA_ROOTOWNER)
ConsoleWrite($hr & @CRLF)
ConsoleWrite(WinGetTitle($hr) & @CRLF)
EndFunc ;==>_
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