[EX] Niveau Debutant : Comment fonctionnent les handles ?
Posté : mer. 06 oct. 2010 18:10
Bonjour à tous, aujourd'hui au menu, manipulation des handles !!
=> C'est quoi un handle ?
c'est une sorte d'identifiant unique, que chaque fenêtre, contrôle (bouton, champ de texte, case à cocher, etc..) possède.
Cet identifiant est attribué par le système de gestion des fenêtres en quelque sorte, par conséquent, pour les applications dont les différents composants graphiques ne sont pas gérés par windows (exemple : applications flash/air, applications java, applications "in-browser", ...), il sera plus compliqué, voire dans beaucoup de cas impossible de récupérer un handle !
=> Comment on récupère un handle ?
facile, on fait un appel à ControlGetHandle, ou à WinGetHandle, avec les paramètres qui vont bien (on verra quels sont-ils à la question suivante).
Ces deux fonctions renvoient directement le handle, que vous pouvez stocker proprement dans une variable pour pouvoir le réutiliser comme vous le souhaitez.
=> Comment on sait quels paramètres passer à WinGetHandle ou ControlGetHandle ?
Pour ceux qui ont déjà utilisé des fonctions du genre WinActivate, WinWaitActive, WinSetState, ControlSend, ControlSetText, etc .... , hé bien il s'agit simplement d'utiliser les même paramètres que si vous souhaitiez appeler les fonctions citées précédemment ! (qui se nomment chaque fois "Title", "Text", "ControlID")
Pour ceux qui n'ont pas utilisé ces fonctions auparavant, il faudra peut être lire la doc de ces fonctions si vous voulez tout bien comprendre ...
Ces paramètres, on les trouve en utilisant "AutoIt Window Info Tool" (raccourci clavier : Ctrl+F6 lorsque vous êtes dans l'éditeur SciTE). Apprenez à utiliser cet outil, car sans lui, il vous sera très difficile de trouver les informations nécessaires pour obtenir un handle !
=> Un petit exemple :
Décorticons un peu :
* je récupère le handle du bouton du menu démarrer (avec en paramètres les données que m'a fourni AutoIt Window Info Tool)
* j'appelle ControlSetText avec à la place du paramètre "Title", simplement le handle (du coup les paramètres suivants n'ont pas besoin d'être remplis, j'y place une chaine vide), et en dernier paramètre, je mets le texte que je souhaite voir afficher sur le bouton démarrer
* je pause 2 secondes pour que tout le monde voie bien que ça marche !
* même processus pour récupérer le handle de la barre des tâches
* cette fois je joue avec la transparence parce que c'est lol.
Ajout : Les handles de fichier + démonstration de l'utilité des handles :
Vous le constatez, cette fois-ci j'appelle encore une variable handle, mais je ne la récupère pas de la même façon que dans les exemples précédents !? pourquoi donc ?!
Tout simplement parce que pour les fichiers, qui peuvent également fonctionner avec des handles, la fonction permettant d'obtenir ledit handle est la fonction FileOpen !! (qui en plus permet d'avoir quelques petits réglages bien sympathiques, notamment sur le mode d'ouverture du fichier)
Une fois le fichier ouvert, on peut utiliser le handle retourné par la fonction pour remplacer les paramètres "filename" des différentes fonctions de manipulation des fichiers.
Attention à une chose : bien que cela ne soit pas très gênant dans la plupart des cas, il est bien entendu très fortement conseillé de correctement fermer chaque handle de fichier ouvert, cela vous évitera bien des surprises !!
Pour la petite histoire des performances :
Avec un handle, le script n'a pas besoin de réouvrir le fichier à chaque appel de FileWrite ou FileWriteLine ... un gain de temps précieux !
Sur ma bécane, il faut entre 16 et 17 secondes pour écrire de façon "traditionnelle" les 10000 lignes dans le fichier, et moins d'une seconde pour écrire exactement les même lignes, dans le même fichier, lorsque l'on utilise un handle ... ! Faites vos tests, éventuellement avec des fichiers beaucoup plus gros, les résultats parlent d'eux-mêmes !!!!
=> Des Questions ? Posez les ci dessous !
=> C'est quoi un handle ?
c'est une sorte d'identifiant unique, que chaque fenêtre, contrôle (bouton, champ de texte, case à cocher, etc..) possède.
Cet identifiant est attribué par le système de gestion des fenêtres en quelque sorte, par conséquent, pour les applications dont les différents composants graphiques ne sont pas gérés par windows (exemple : applications flash/air, applications java, applications "in-browser", ...), il sera plus compliqué, voire dans beaucoup de cas impossible de récupérer un handle !
=> Comment on récupère un handle ?
facile, on fait un appel à ControlGetHandle, ou à WinGetHandle, avec les paramètres qui vont bien (on verra quels sont-ils à la question suivante).
Ces deux fonctions renvoient directement le handle, que vous pouvez stocker proprement dans une variable pour pouvoir le réutiliser comme vous le souhaitez.
=> Comment on sait quels paramètres passer à WinGetHandle ou ControlGetHandle ?
Pour ceux qui ont déjà utilisé des fonctions du genre WinActivate, WinWaitActive, WinSetState, ControlSend, ControlSetText, etc .... , hé bien il s'agit simplement d'utiliser les même paramètres que si vous souhaitiez appeler les fonctions citées précédemment ! (qui se nomment chaque fois "Title", "Text", "ControlID")
Pour ceux qui n'ont pas utilisé ces fonctions auparavant, il faudra peut être lire la doc de ces fonctions si vous voulez tout bien comprendre ...
Ces paramètres, on les trouve en utilisant "AutoIt Window Info Tool" (raccourci clavier : Ctrl+F6 lorsque vous êtes dans l'éditeur SciTE). Apprenez à utiliser cet outil, car sans lui, il vous sera très difficile de trouver les informations nécessaires pour obtenir un handle !
=> Un petit exemple :
Décorticons un peu :
* je récupère le handle du bouton du menu démarrer (avec en paramètres les données que m'a fourni AutoIt Window Info Tool)
* j'appelle ControlSetText avec à la place du paramètre "Title", simplement le handle (du coup les paramètres suivants n'ont pas besoin d'être remplis, j'y place une chaine vide), et en dernier paramètre, je mets le texte que je souhaite voir afficher sur le bouton démarrer
* je pause 2 secondes pour que tout le monde voie bien que ça marche !
* même processus pour récupérer le handle de la barre des tâches
* cette fois je joue avec la transparence parce que c'est lol.
Code : Tout sélectionner
;***************************************************************************************
;** HANDLE D'UN CONTROLE : LE BOUTON "DEMARRER"
;***************************************************************************************
$handleBoutonMenuDemarrer = ControlGetHandle("[CLASS:Shell_TrayWnd]", "démarrer", "[CLASS:Button; INSTANCE:1]")
ControlSetText($handleBoutonMenuDemarrer, "", "", "Coucou")
Sleep(2000)
;***************************************************************************************
;** HANDLE D'UNE FENETRE : LA BARRE DES TACHES (Hé oui c'est aussi une fenêtre !)
;***************************************************************************************
$handleBarreDesTaches = WinGetHandle("[CLASS:Shell_TrayWnd]", "")
For $i = 255 To 1 Step -1
WinSetTrans($handleBarreDesTaches, "", $i)
Next
For $i = 1 To 255 Step 1
WinSetTrans($handleBarreDesTaches, "", $i)
Next
Code : Tout sélectionner
;***************************************************************************************
;** TEMPS D'ECRITURE :
;***************************************************************************************
;** SANS HANDLE :
;********************************************
FileDelete("c:\test.txt")
$begin = TimerInit()
For $i=0 TO 10000 Step 1
FileWriteLine("c:\test.txt", "ceci est une ligne de test, écrite dix-mille fois dans ce fichier")
Next
$timerdiff1 = TimerDiff($begin)
;** AVEC HANDLE :
;********************************************
FileDelete("c:\test.txt")
$begin = TimerInit()
$handle = FileOpen("c:\test.txt", 1)
For $i=0 TO 10000 Step 1
FileWriteLine($handle, "ceci est une ligne de test, écrite dix-mille fois dans ce fichier")
Next
$timerdiff2 = TimerDiff($begin)
FileClose($handle)
;** RESULTATS :
;********************************************
MsgBox(64, "résultats du test de performances", _
"temps d'écriture de 10 000 lignes dans un fichier sans utiliser de handle : " & $timerdiff1/1000 & "secondes" & @CRLF & _
"temps d'écriture de 10 000 lignes dans un fichier en utilisant un handle : " & $timerdiff2/1000 & "secondes" & @CRLF )
Tout simplement parce que pour les fichiers, qui peuvent également fonctionner avec des handles, la fonction permettant d'obtenir ledit handle est la fonction FileOpen !! (qui en plus permet d'avoir quelques petits réglages bien sympathiques, notamment sur le mode d'ouverture du fichier)
Une fois le fichier ouvert, on peut utiliser le handle retourné par la fonction pour remplacer les paramètres "filename" des différentes fonctions de manipulation des fichiers.
Attention à une chose : bien que cela ne soit pas très gênant dans la plupart des cas, il est bien entendu très fortement conseillé de correctement fermer chaque handle de fichier ouvert, cela vous évitera bien des surprises !!
Pour la petite histoire des performances :
Avec un handle, le script n'a pas besoin de réouvrir le fichier à chaque appel de FileWrite ou FileWriteLine ... un gain de temps précieux !
Sur ma bécane, il faut entre 16 et 17 secondes pour écrire de façon "traditionnelle" les 10000 lignes dans le fichier, et moins d'une seconde pour écrire exactement les même lignes, dans le même fichier, lorsque l'on utilise un handle ... ! Faites vos tests, éventuellement avec des fichiers beaucoup plus gros, les résultats parlent d'eux-mêmes !!!!
=> Des Questions ? Posez les ci dessous !