Dans le mode Message-loop votre script passera la majorité de son temps dans une boucle infinie. Cette boucle interrogera simplement la GUI en utilisant la fonction GUIGetMsg. Lorsqu'un événement s'est produit, la valeur de retour de la fonction GUIGetMsg montrera les détails (Un bouton est cliqué, la GUI à été fermée, etc.).
Le mode MessageLoop est le mode de message par défaut pour les GUIs AutoIt - L'autre mode possible est le mode OnEvent.
Dans le mode MessageLoop vous recevrez uniquement des événements tandis que vous interrogerez activement la fonction GUIGETMSG, donc vous devez vous assurer que vous l'appelez plusieurs fois par seconde sous peine de rendre votre GUI inerte..
Le code de la structure d'une boucle MessageLoop est :
While 1
$msg = GUIGetMsg()
...
...
WEnd
Généralement une boucle infinie comme ci-dessus utilisera 100% de votre CPU - Heureusement la fonction GUIGetMsg met en veille le CPU automatiquement lorsqu'il n'y à aucun événement en attente. Surtout ne mettez jamais une pause manuelle dans la boucle de peur de trop utiliser le CPU - Cela ne fera que rendre votre GUI inerte.
Il y a trois types de message d'événement retourné par GUIGetMsg :
Evénement Nul
Lorsqu'il n'y a aucun événement en attente de traitement, GUIGetMsg retourne 0. Dans une GUI classique, c'est l'événement le plus commun.
Evénement Contrôle
Lorsqu'un contrôle est cliqué ou modifié un événement contrôle est envoyé - Celui-ci est un nombre positif qui correspond au controlID retourné lors de la création du contrôle par GUICtrlCreate....
Evénement Système
Les événements système tel que la fermeture de la GUI sont des nombres négatif. Les différents événements sont montrés ci-dessous et sont définis dans GUIConstantsEx.au3 :
$GUI_EVENT_CLOSE
$GUI_EVENT_MINIMIZE
$GUI_EVENT_RESTORE
$GUI_EVENT_MAXIMIZE
$GUI_EVENT_PRIMARYDOWN
$GUI_EVENT_PRIMARYUP
$GUI_EVENT_SECONDARYDOWN
$GUI_EVENT_SECONDARYUP
$GUI_EVENT_MOUSEMOVE
$GUI_EVENT_RESIZED
$GUI_EVENT_DROPPED
Dans la page principale Référence GUI nous avons commencé un exemple simple (Hello World) qui ressemblait à ceci :
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
Sleep(2000)
Maintenant nous allons finir le code en utilisant une boucle de message MessageLoop et certains des messages d'événement décrits ci-dessus. Il est habituel à cause du nombre de messages possibles, d'utiliser l'expression Select pour une meilleur lisibilité.
#include <GUIConstantsEx.au3>
GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg()
Select
Case $msg = $okbutton
MsgBox(0, "GUI Event", "Vous avez appuyé sur OK !")
Case $msg = $GUI_EVENT_CLOSE
MsgBox(0, "GUI Event", "Vous avez cliqué FERMER ! Sortie...")
ExitLoop
EndSelect
WEnd
C'est aussi simple que ça. Évidemment plus il y à de fenêtres et de contrôles, plus le script est compliqué. Mais ce qui vient d'être montré vous donne l'essentiel.
Les contrôles ID sont uniques, même si vous avez des fenêtres multiples, donc le code précédent fonctionnera trés bien avec des contrôles et des fenêtres multiples. Toutefois, lors du traitement des événements comme $GUI_EVENT_CLOSE ou $GUI_MOUSEMOVE vous devez savoir quelle fenêtre GUI a produit l'événement. Pour ce faire, vous devez appeler GUIGetMsg comme ceci :
$msg = GUIGetMsg(1)
Lors de l'appel avec le paramètre 1, au lieu de retourner une valeur d'événement, une Matrice (Array) est retournée. Cette matrice contient l'événement ( Dans $array[0] ) et l'informations complémentaire du handle de la fenêtre ( Dans $array[1] ). Si deux fenêtres sont créées dans notre exemple précédent, alors la méthode d'écriture du code serait :
#include <GUIConstantsEx.au3>
$mainwindow = GUICreate("Hello World", 200, 100)
GUICtrlCreateLabel("Hello world! Comment allez vous ?", 30, 10)
$okbutton = GUICtrlCreateButton("OK", 70, 50, 60)
$dummywindow = GUICreate("Fenêtre de test factice", 200, 100)
GUISwitch($mainwindow)
GUISetState(@SW_SHOW)
While 1
$msg = GUIGetMsg(1)
Select
Case $msg[0] = $okbutton
MsgBox(0, "GUI Event", "Vous avez appuyé sur OK !")
Case $msg[0] = $GUI_EVENT_CLOSE And $msg[1] = $mainwindow
MsgBox(0, "GUI Event", "Vous avez cliqué FERMER
sur la fenêtre principale ! Sortie...")
ExitLoop
EndSelect
WEnd
Le premier changement majeur est l'appel à la fonction GUISwitch - Quand une nouvelle fenêtre est créée elle devient la fenêtre par défaut pour les opérations GUI qui suivent (Y compris la création de contrôles). Dans notre cas, nous voulons travailler avec la fenêtre principale "Hello World" et non la fenêtre de test. Donc nous allons "commuter (switch)" de fenêtre. Certaines fonctions GUI vous authorise à utiliser le handle de la fenêtre à l'intérieur de l'appel de la fonction - Ces fonctions commuterons automatiquement. Dans notre exemple nous pourrions l'avoir fait avec :
GUISetState(@SW_SHOW, $mainwindow)
L'autre changement est la manière dont GUIGetMsg est appelé et comment sont vérifiés les événements - Notez l'utilisation de $msg[0] et $msg[1] - Maintenant, nous sortirons du script seulement si l'événement Fermer ($GUI_EVENT_CLOSE) est envoyé et que celui-ci provient de la fenêtre principale.