Demande d'avis et conseil sur ce script (Remake ALT+TAB)

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Avatar du membre
Paatou
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 09 oct. 2009 18:38
Status : Hors ligne

Demande d'avis et conseil sur ce script (Remake ALT+TAB)

#1

Message par Paatou »

Salut,

J'ai créé un script permettant de basculer entre diverses fenêtres choisies (un remake du ALT+TAB de windows en quelques sortes).

Il fonctionne donc ce que j'attends ici ce sont des avis expérimentés sur ce script :
- ce qui est bien
- ce qu'il faut améliorer (et comment)
- existe-t-il des solutions (simples) pour faire la même chose avec de meilleures performances ?

Code : Tout sélectionner

;
;=============================================================================================================================================
; L'objectif de ce scripte est de reprogrammer la touche ² afin qu'elle permette de passer d'une fenêtre à une autre parmi celles choisies.
; Lorsque l'on change de fenêtre active, on minimise l'actuelle
;
; La 1ère pression de la touche ² minimisera la dernière fenêtre et activera la première.
;
; Note d'utilisation : pour pouvoir ré-arranger à volonté des icônes dans la barre de tâches Windows, on peut utiliser le logiciel gratuit
;                      "7+ Taskbar Tweaker" et sélectionner l'option "Ne pas grouper"
;
;=============================================================================================================================================
;
; COMBINAISON SHIFT+PAUSE = Mettre en PAUSE
; COMBINAISON SHIFT+ESC   = Arreter le scripte
;

; Sources d'informations pour la récupération de caractéristiques et l'utilisation du code "handle" identifiant une fenêtre:
;	http://autoitscript.fr/forum/viewtopic.php?t=5731
;	http://www.autoitscript.fr/forum/viewtopic.php?t=975
;	http://autoitscript.fr/forum/viewtopic.php?t=5731

Global $Paused
HotKeySet("+{PAUSE}", "TogglePause")
HotKeySet("+{ESC}", "Terminate")
HotKeySet("{F9}", "Memo_Fenetres")
HotKeySet("{²}", "Switch_Fen")

Opt("SendKeyDownDelay", 100)

;Initialisations
;--------------- 
$NbFen = 0
$NbFen2 = 0
$NumFenMemo = 0
$NumFenActive = 0
$t = 100

;Boite de message indiquant les raccourcis
;-------------------------------------------

MsgBox(0, "Actions", "F9                        : Récupère et affiche les identifiants des N fenêtres actives" & chr(13) _
				   & "²                           : Switch entre les N fenêtres dans l'ordre de mémorisation " & chr(13) _
				   & "SHIFT + PAUSE : Mettre/ôter la pause du programme de macros" & chr(13) _
				   & "SHIFT + ESC      : Arreter le programme de macros")

;Boite de message demandant le nombre de fenêtre entre lesquelles on veut switcher et dimensionnement du tableau (attention index commençant à 0 !) 
;----------------------------------------------------------------------------------------------------------------------------------------------------
;InputBox ( "title", "prompt" [, "default" [, "password char" [, width [, height [, left [, top [, timeout [, hwnd]]]]]]]] )

While $NbFen <= 0
   $NbFen = InputBox("Nombre de fenêtres à mémoriser", "Combien de fenêtres voulez-vous mémoriser ?")
WEnd

Global $TabFen[$NbFen]
;MsgBox(0, "Valeurs tableau", "$TabFen[0]=" & $TabFen[0] & chr(13) & "$TabFen[1]=" & $TabFen[1])

;Boucle infinie formant le corps du programme
;---------------------------------------------
While 1
	Sleep($t)
WEnd

;********** MES FONCTIONS **********

;Mémorisation des ID des N fenêtres (touche F9)
;-----------------------------------------------
Func Memo_Fenetres()
   If $NumFenMemo < $NbFen Then
	  $NumFenMemo = $NumFenMemo + 1
	  $TabFen[$NumFenMemo - 1] = WinGetHandle("[ACTIVE]", "")
	  $NumFenActive = $NumFenMemo
	  MsgBox(0, "Récupération caractéristique fenêtre active", "Le Handle de la fenêtre active N°= " & $NumFenActive & " est : " & $TabFen[$NumFenActive - 1])
   Else
	  $NbFen2 = InputBox("Nombre de fenêtres à mémoriser", "Pour refaire mémorisation des fenêtres entrer leur nombre, sinon pressez sur la touche entrée ou cliquez sur OK ")
	  IF $NbFen2 > 0 Then
		 $NbFen = $NbFen2
		 Global $TabFen[$NbFen]
		 $NumFenMemo = 0
	  EndIf
   EndIf
EndFunc

;Balayage des fenêtres mémorisées en minimisant celle que l'on "quitte" (touche ²)
;-----------------------------------------------------------------------------------
Func Switch_Fen()
   WinSetState($TabFen[$NumFenActive - 1], "", @SW_MINIMIZE)
   If $NumFenActive < $NbFen Then
	  $NumFenActive = $NumFenActive + 1
   Else
	  $NumFenActive = 1
   EndIf
   WinActivate($TabFen[$NumFenActive - 1])
EndFunc

;----------------------------------

; Presser Pause/Attn pour mettre en pause

Func TogglePause()
     $Paused = NOT $Paused
     While $Paused
         sleep(100)
         ToolTip('Script is "Paused"',0,0)
     WEnd
;     ToolTip("")
EndFunc

;----------------------------------
; Presser Esc pour arreter le scripte

Func Terminate()
     Exit 0
EndFunc
Merci :-).
Modifié en dernier par Paatou le ven. 11 mars 2016 18:01, modifié 2 fois.
Avatar du membre
Paatou
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 09 oct. 2009 18:38
Status : Hors ligne

Re: Demande d'avis et conseil sur ce script

#2

Message par Paatou »

Pour les personnes qui veulent tester avant de lire/comprendre le code, ça marche comme ça :
- En lançant le script, on doit entrer le nombre de fenêtres à mémoriser
- Ensuite on active manuellement chaque fenêtre et on presse F9 pour les identifier
- Une fois toutes les fenêtres connues, on utilise la touche ² pour passer de l'une à l'autre.

ET pour quitter le script, le raccourci est SHIFT+ESC
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Demande d'avis et conseil sur ce script (Remake ALT+TAB)

#3

Message par orax »

;
;=============================================================================================================================================
; L'objectif de ce scripte est de reprogrammer la touche ² afin qu'elle permette de passer d'une fenêtre à une autre parmi celles choisies.
; Lorsque l'on change de fenêtre active, on minimise l'actuelle
;
; La 1ère pression de la touche ² minimisera la dernière fenêtre et activera la première.
;
; Note d'utilisation : pour pouvoir ré-arranger à volonté des icônes dans la barre de tâches Windows, on peut utiliser le logiciel gratuit
;                      "7+ Taskbar Tweaker" et sélectionner l'option "Ne pas grouper"
;
;=============================================================================================================================================
;
; COMBINAISON SHIFT+PAUSE = Mettre en PAUSE
; COMBINAISON SHIFT+ESC   = Arreter le scripte
;

; Sources d'informations pour la récupération de caractéristiques et l'utilisation du code "handle" identifiant une fenêtre:
;   viewtopic.php?t=5731
;   http://www.autoitscript.fr/forum/viewtopic.php?t=975
;   viewtopic.php?t=5731
;
;=============================================================================================================================================
; L'objectif de ce scripte est de reprogrammer la touche ² afin qu'elle permette de passer d'une fenêtre à une autre parmi celles choisies.
; Lorsque l'on change de fenêtre active, on minimise l'actuelle
;
; La 1ère pression de la touche ² minimisera la dernière fenêtre et activera la première.
;
; Note d'utilisation : pour pouvoir ré-arranger à volonté des icônes dans la barre de tâches Windows, on peut utiliser le logiciel gratuit
;                      "7+ Taskbar Tweaker" et sélectionner l'option "Ne pas grouper"
;
;=============================================================================================================================================
;
; COMBINAISON SHIFT+PAUSE = Mettre en PAUSE
; COMBINAISON SHIFT+ESC   = Arreter le scripte
;

; Sources d'informations pour la récupération de caractéristiques et l'utilisation du code "handle" identifiant une fenêtre:
;   <!-- l --><a class=\"postlink-local\" href=\"http://autoitscript.fr/forum/viewtopic.php?t=5731\">viewtopic.php?t=5731</a><!-- l -->
;   <!-- m --><a class=\"postlink\" href=\"http://www.autoitscript.fr/forum/viewtopic.php?t=975\">http://www.autoitscript.fr/forum/viewtopic.php?t=975</a><!-- m -->
;   <!-- l --><a class=\"postlink-local\" href=\"http://autoitscript.fr/forum/viewtopic.php?t=5731\">viewtopic.php?t=5731</a><!-- l -->

#include <AutoItConstants.au3>

Global $Paused
HotKeySet("+{PAUSE}", "TogglePause")
HotKeySet("+{ESC}", "Terminate")
HotKeySet("{F9}", "Memo_Fenetres")
HotKeySet("{²}", "Switch_Fen")

Opt("SendKeyDownDelay", 100)

;Initialisations
;---------------
$NbFen = 0
$NbFen2 = 0
$NumFenMemo = 0
$NumFenActive = 0
$t = 100

;Boite de message indiquant les raccourcis
;-------------------------------------------

; chr(13) = @CR
; StringFormat() peut parfois être pratique pour ce genre de trucs (ajouter un certain nombre d'espaces, aligner à droite, ...).
; Par contre, la police utilisée avec MsgBox n'est pas à chasse fixe donc l'alignement ne sera pas parfait : il y a entre autres un léger décalage au niveau de la 2e ligne.
; L'exemple après, avec SplashTextOn + "Courier New", ne présente pas ce problème.
MsgBox(0, "Actions", "F9                        : Récupère et affiche les identifiants des N fenêtres actives" & @CR _
       & "²                           : Switch entre les N fenêtres dans l'ordre de mémorisation " & @CR _
       & "SHIFT + PAUSE : Mettre/ôter la pause du programme de macros" & @CR _
       & "SHIFT + ESC      : Arreter le programme de macros")

; exemple avec une police à chasse fixe (Courier New)
SplashTextOn(@ScriptName, _
      "F9            : Récupère et affiche les identifiants des N fenêtres actives" & @LF & _
      "²             : Switch entre les N fenêtres dans l'ordre de mémorisation " & @LF & _
      "SHIFT + PAUSE : Mettre/ôter la pause du programme de macros" & @LF & _
      "SHIFT + ESC   : Arreter le programme de macros", "600", "-1", "-1", "-1", $DLG_TEXTLEFT, "Courier New", "9", "400")
Sleep(5000)
SplashOff()

;Boite de message demandant le nombre de fenêtre entre lesquelles on veut switcher et dimensionnement du tableau (attention index commençant à 0 !)
;----------------------------------------------------------------------------------------------------------------------------------------------------
;InputBox ( "title", "prompt" [, "default" [, "password char" [, width [, height [, left [, top [, timeout [, hwnd]]]]]]]] )

While $NbFen <= 0
   $NbFen = InputBox("Nombre de fenêtres à mémoriser", "Combien de fenêtres voulez-vous mémoriser ?")
WEnd

Global $TabFen[$NbFen]
;MsgBox(0, "Valeurs tableau", "$TabFen[0]=" & $TabFen[0] & chr(13) & "$TabFen[1]=" & $TabFen[1])

;Boucle infinie formant le corps du programme
;---------------------------------------------
While 1
   Sleep($t)
WEnd

; #Region pourrait être utilisé à la place d'un commentaire. Ça permet de plier/déplier (masquer/démasquer) toute la région.
#Region MES FONCTIONS
;********** MES FONCTIONS **********

;Mémorisation des ID des N fenêtres (touche F9)
;-----------------------------------------------
Func Memo_Fenetres()
   If $NumFenMemo < $NbFen Then
      $NumFenMemo = $NumFenMemo + 1
      $TabFen[$NumFenMemo - 1] = WinGetHandle("[ACTIVE]", "")
      $NumFenActive = $NumFenMemo
      MsgBox(0, "Récupération caractéristique fenêtre active", "Le Handle de la fenêtre active N°= " & $NumFenActive & " est : " & $TabFen[$NumFenActive - 1])
   Else
      $NbFen2 = InputBox("Nombre de fenêtres à mémoriser", "Pour refaire mémorisation des fenêtres entrer leur nombre, sinon pressez sur la touche entrée ou cliquez sur OK ")
      If $NbFen2 > 0 Then
         $NbFen = $NbFen2

         ; $TabFen est déjà déclaré plus haut donc il n'est pas utile de le redéclarer à nouveau.
         ; Il est également déconseillé de déclarer une variable en Global à l'intérieur d'une fonction.
         ; S'il faut redimensionner le tableau $TabFen, il faudra utiliser ReDim.
         ;Global $TabFen[$NbFen]
         ReDim $TabFen[$NbFen]

         $NumFenMemo = 0
      EndIf
   EndIf
EndFunc   ;==>Memo_Fenetres

;Balayage des fenêtres mémorisées en minimisant celle que l'on "quitte" (touche ²)
;-----------------------------------------------------------------------------------
Func Switch_Fen()
   WinSetState($TabFen[$NumFenActive - 1], "", @SW_MINIMIZE)
   If $NumFenActive < $NbFen Then
      ;$NumFenActive = $NumFenActive + 1 <= cette ligne peut être remplacée par celle ci-dessous (identique mais plus courte à écrire)
      $NumFenActive += 1
   Else
      $NumFenActive = 1
   EndIf
   WinActivate($TabFen[$NumFenActive - 1])
EndFunc   ;==>Switch_Fen

;----------------------------------

; Presser Pause/Attn pour mettre en pause

Func TogglePause()
   $Paused = Not $Paused
   While $Paused
      Sleep(100)
      ToolTip('Script is "Paused"', 0, 0)
   WEnd
   ;     ToolTip("")
EndFunc   ;==>TogglePause

;----------------------------------
; Presser Esc pour arreter le script

Func Terminate()
   Exit 0
EndFunc   ;==>Terminate

#EndRegion MES FONCTIONS
J'ai modifié certaines choses (lire mes commentaires). Tu peux aussi regarder les bonnes pratiques de codage pour AutoIt.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Paatou
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 09 oct. 2009 18:38
Status : Hors ligne

Re: Demande d'avis et conseil sur ce script (Remake ALT+TAB)

#4

Message par Paatou »

Super, merci pour ces retours je ais les mettre en oeuvre.

Je note que sur la technique de fond (faire une boucle infinie avec un temps de 100, le minimize et activate en pressant la touche ² reprogrammée)
tout est inchangé, j'en déduis donc que j'ai déjà la bonne technique, même si parfois je trouve le changement de fenêtre un peu lent (ça vient de Windows je présumé ^^)
Avatar du membre
orax
Modérateur
Modérateur
Messages : 1479
Enregistré le : lun. 23 mars 2009 04:50
Localisation : ::1
Status : Hors ligne

Re: Demande d'avis et conseil sur ce script (Remake ALT+TAB)

#5

Message par orax »

Pour la boucle infinie, on pourrait mettre un temps de 60 secondes (Sleep(60000)), ça ne changerait rien avec HotKeySet.

Quand on fait ALT+TAB, Windows ne minimise pas la fenêtre active donc la ligne WinSetState($TabFen[$NumFenActive - 1], "", @SW_MINIMIZE) n'est peut-être pas nécessaire. C'est peut-être pour ça que le changement de fenêtre est un peu lent. Et s'il y a des animations lors des agrandissements et réductions ça sera d'autant plus lent.

Opt("SendKeyDownDelay", 100) est pour changer le comportement de la fonction Send() donc cette ligne n'est pas utile.
De petits détails peuvent faire toute la différence. — Quand la boule de neige commence à rouler… poussez-la. (Columbo)
Avatar du membre
Paatou
Niveau 1
Niveau 1
Messages : 7
Enregistré le : ven. 09 oct. 2009 18:38
Status : Hors ligne

Re: Demande d'avis et conseil sur ce script (Remake ALT+TAB)

#6

Message par Paatou »

Merci, je mets cela en œuvre.
Très bonne idée de monter le délai à 60s, il est vrai que dans ce script je ne gère plus des actions comme dans celui d'avant :-D.
Répondre