Notice: Undefined index: HTTP_ACCEPT_LANGUAGE in /home/eartdfr/www_ile-avalon/_private/tracking.php on line 8
L'île Avalon [AutoHotKey - Fonction, mon amie]
  • L
  • M
  • M
  • J
  • V
  • S
  • D
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

AutoHotKey - Fonction, mon amie

Voici une notion qu'il va être préférable de maîtriser si vous voulez comprendre certains scripts de cette rubrique :

Les Fonctions !

Remarquez que l'usage des fonctions est déjà expliqué dans la documentation d'AutoHotKey, mais la page dédiée aux fonctions n'est pas évidente à trouver et elle est en Anglais, j'ai donc préféré en redire deux mots ici. Malgré tout je vous encourage à consulter la page des fonctions sur AutoHotKey.com : Fonctions.

Qu'est-ce qu'une fonction ?

Une fonction est une routine pouvant accepter des paramètres et pouvant retourner un résultat, que l'on peut appeler à tous moments au sein d'un script. C'est un gain en clarté à la lecture et à la compréhension d'un programme, elle évite les inombrables copier/coller et duplication de lignes de codes et enfin permet de "centraliser" une tâche précise de votre script.

Exemple avec la fonction Add :

Add(x,y)
{
 return x + y
}

L'appel à une fonction s'effectu comme ceci :

Var := Add(2,3)

La variable Var recevra le résultat de la fonction, c'est à dire le résultat de l'addition de 2 + 3, donc la valeur 5.

On peut aussi l'utiliser comme ceci :

Add(2,3)

Bien évidemment, dans le cas ci-dessus notre fonction Add n'apporte pas grand chose puisque son résultat sera perdu...

Les paramétres

Dans notre fonction Add, x et y sont des paramètres, un paramètre fonctionne comme une variable au sein de sa fonction si ce n'est que cette variable est affectée par une valeure externe à la fonction au moment de son appel. Dans l'exemple précédent, x et y avaient reçus les valeurs 2 et 3 au moment de l'appel à la fonction Add, ce qui a permi ensuite à la fonction d'effectuer l'addition de x plus y et de nous retourner la valeur 5.

Comme on l'a vu, une fonction est limité à une seule valeur de retour par le biais de l'instruction return. Mais on peut aussi effectuer un passage de paramétres par "référence" grace à l'instruction byref.

Les paramétres byref

Toutes actions effectuées sur un paramètre par référence se répercutera sur la variable qui lui est associée lors de l'appel à la fonction.

Un exemple pour être plus clair :

Swap(ByRef Left, ByRef Right)
{
 Temp := Left
 Left := Right
 Right := Temp
}

La fonction Swap permet d'inverser les valeurs Left et Right passées en paramètres.
Ainsi à l'utilisation on aura :

L := 2
R := 3

Swap(L, R)

; Après l'appel à Swap, L = 3 et R = 2

Vous noterez que chaque paramètre voit sa déclaration précédée du terme "ByRef", si vous ne mettez pas l'instruction byref tout se que l'on fait sur le paramètre n'aura aucune répercution sur la variable associée au moment de l'appel. Ainsi si l'on avait écrit la fonction Swap comme ceci :

Swap(ByRef Left, Right)
{
 Temp := Left
 Left := Right
 Right := Temp
}

Et bien au moment de l'appel suivant :

L := 2
R := 3

Swap(L, R)

Après l'appel à Swap, la variable L aurait bien reçu la valeur de R car L est passée par référence, mais R n'aurait pas été modifié car elle n'est pas passée par référence...

Les Variables locales et variables globales

Dans la fonction Swap on a utilisé une variable Temp afin de stocker temporairement la valeur de Left, cette variable Temp est une variable dite locale à la fonction, c'est à dire qu'elle n'est utilisable qu'au sein de la fonction en elle-même et ne pourra pas être utilisée dans le reste du script.

De plus, une fonction ne peut utiliser que les variables qui lui sont locales et ces paramètres. Hors, si l'on veut qu'une fonction puisse accéder à une variable qui lui est externe sans pour autant devoir la passer en paramètre on va devoir déclarer cette fonction comme étant "globale".

Exemple :

SetDefault()
{
 global A := 33
 B := 12
 C := 54
}

A := 0
B := 0
C := 0

SetDefault()

Après l'appel à SetDefault, la valeur de A passe à 33 mais B et C sont toujours à 0 car seule A est déclarée comme étant globale au sein de la fonction.

On peut aussi déclarer toutes les variables d'une fonction comme étant globale, il suffit d'utiliser global comme suit :

SetDefault()
{
 global
 A := 33
 B := 12
 C := 54
}

A := 0
B := 0
C := 0

SetDefault()

contrairement à la version précédente, A recevra 33, B recevra 12 et C recevra 54 car toutes les variables de la fonction SetDefaut sont des variables globales.

Variable statique

La durée de vie d'une variable se limite à la durée de vie de sa fonciton, pourtant il est possible à une variable de rester en mémoire et d'être réutilisable telle qu'elle été lors de son précédent appel, à chaque nouvel appel de la fonction. On dit que la variable est "statique".

Reprennons notre fonction Add, supposons que l'on veuille compter le nombre de fois que l'on a fait appel à cette fonction :

Add(x,y)
{
 static NbPassage = 0

 NbPassage += 1

 MsgBox, Vous êtes passez %NbPassage% fois dans la fonction Add.

 return x + y
}

Dans notre nouvelle fonction Add, la valeur de NbPassage est statique, elle sera donc concervée et réutilisée à chaque nouvel appel à la fonction. Vu qu'au sein de la fonction on se contente d'y ajouter la valeur 1, et bien au premier passage NbPassage sera égal à 1, puis au second à 2, etc.

C := Add(1,3) ; Message : "Vous êtes passez 1 fois dans la fonction Add."
C := Add(5,8) ; Message : "Vous êtes passez 2 fois dans la fonction Add."
C := Add(4,2) ; Message : "Vous êtes passez 3 fois dans la fonction Add."
C := Add(6,1) ; Message : "Vous êtes passez 4 fois dans la fonction Add."
C := Add(9,3) ; Message : "Vous êtes passez 5 fois dans la fonction Add."

Plus encore avec les Fonctions

J'ai fait le tour de se qui me semblait important à connaître concernant les fonctions, et que vous risquez de retrouver dans les scrips de cette rubrique, mais il existe d'autres notions, telles que le paramètre optionnel, je vous invite a consulter la documentation d'AutoHotKey pour ce qui n'est pas expliqué ici (Fonctions sur AutoHotKey.com)...

Un peu de concret

Ok, on a vu que l'on pouvait ajouter deux valeurs avec notre fonciton Add, en inverser deux avec Swap, mais concrètement peut on avoir un exemple plus en rapport avec le Multiboxing ? :-)

Une fonction pour les Touches

On a vu sur dualboxing.fr que l'on pouvait dupliquer la frappe d'une touche sur plusieurs fenêtres de World of Warcraft, c'est fort pratique mais il faut répéter pas moins de 6 lignes de code pour chaque touche de notre clavier. Autant dire que notre script devient très vite long et que l'on est pas à l'abrit d'une faute de frappe lors d'un copier/coller. La solution ? Et bien pourquoi ne pas rassembler toutes ces lignes de codes en une fonction dans laquelle on passerait en paramètre la touche à simuler ?

Ainsi, notre pavé de ligne de code :

~&::
 KeyWait, &, D
 {
  ControlSend,, {&}, ahk_id %wowid1%
  ControlSend,, {&}, ahk_id %wowid2%
  ControlSend,, {&}, ahk_id %wowid3%
  ControlSend,, {&}, ahk_id %wowid4%
 }
Return

~é::
 KeyWait, é, D
 {
  ControlSend,, {é}, ahk_id %wowid1%
  ControlSend,, {é}, ahk_id %wowid2%
  ControlSend,, {é}, ahk_id %wowid3%
  ControlSend,, {é}, ahk_id %wowid4%
 }
Return

~"::
 KeyWait, ", D
 {
  ControlSend,, {"}, ahk_id %wowid1%
  ControlSend,, {"}, ahk_id %wowid2%
  ControlSend,, {"}, ahk_id %wowid3%
  ControlSend,, {"}, ahk_id %wowid4%
 }
Return

ect.

Deviendrait la fonction suivante :

MyControlSend(KeyWait, KeySend) {

 global ; Cela permet d'accéder à wowid1, wowid2, etc.

 KeyWait, %KeyWait%, D
 {
  ControlSend,, %KeySend%, ahk_id %wowid1%
  ControlSend,, %KeySend%, ahk_id %wowid2%
  ControlSend,, %KeySend%, ahk_id %wowid3%
  ControlSend,, %KeySend%, ahk_id %wowid4%
 }
}

Et l'usage de cette fonction serait :

~&:: MyControlSend("&","{&}")
~é:: MyControlSend("é","{é}")
~":: MyControlSend("""","{"""}") ; Attention aux ", "", """ et """" :-)

ect.

Vous voila fin pret pour passer à la suite... ;-)