Dans le mode Message-loop votre script passera la majorit� de son temps dans une boucle While. 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 perdre la r�activit� de votre GUI.
Le code de la structure d'une boucle MessageLoop est:
Local $iMsg = GUIGetMsg()
While $iMsg <> $GUI_EVENT_CLOSE
...
...
$iMsg = GUIGetMsg()
WEnd
ou, avec la condition d'arr�t en fin de boucle Do:
Local $iMsg
Do
$iMsg = GuiGetMsg()
...
...
Until $iMsg = $GUI_EVENT_CLOSE
G�n�ralement une boucle 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! How are you?", 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 conseill�, lorsqu'il faut traiter plusieurs messages, d'utiliser l'instruction Select pour une meilleure lisibilit�.
#include <Constants.au3>
#include <GUIConstantsEx.au3>
Local $hGUI = GUICreate("Bonjour � tous", 200, 100)
GUICtrlCreateLabel("Bonjour � tous! Comment allez-vous?", 50, 10)
Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
GUISetState(@SW_SHOW, $hGUI)
Local $iMsg = GUIGetMsg()
While $iMsg <> $GUI_EVENT_CLOSE
If $iMsg = $iOKButton Then
MsgBox($MB_SYSTEMMODAL, "Ev�nement GUI", "Vous avez cliqu� sur le bouton OK.")
EndIf
$iMsg = GUIGetMsg()
WEnd
MsgBox($MB_SYSTEMMODAL, "Ev�nement GUI", "Vous avez cliqu� sur le bouton Close. Sortie...")
GUIDelete($hGUI)
C'est aussi simple que �a. �videmment plus il y a 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:
Lors de l'appel avec le param�tre 1, au lieu de retourner une valeur d'�v�nement, un tableau array est retourn�. Ce tableau contient l'�v�nement (dans $array[0]) et l'information compl�mentaire du handle de la fen�tre (dans $array[1]). Si deux fen�tres �taient cr��es dans notre exemple pr�c�dent, alors la m�thode d'�criture du code serait:
#include <Constants.au3>
#include <GUIConstantsEx.au3>
Local $hMainGUI = GUICreate("Bonjour � tous", 200, 100)
GUICtrlCreateLabel("Bonjour � tous! Comment allez-vous?", 50, 10)
Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
Local $hDummyGUI = GUICreate("Fen�tre factice pour le test", 200, 100)
GUISwitch($hMainGUI)
GUISetState(@SW_SHOW)
Local $aMsg ; un tableau
Do
$aMsg = GUIGetMsg(1)
If $aMsg[0] = $iOKButton Then
MsgBox($MB_SYSTEMMODAL, "Ev�nement GUI", "Vous avez cliqu� sur OK!")
EndIf
Until $aMsg[0] = $GUI_EVENT_CLOSE And $aMsg[1] = $hMainGUI
MsgBox($MB_SYSTEMMODAL, "Ev�nement GUI", "Vous avez cliqu� sur CLOSE dans la fen�tre principale! Sortie...")
Le premier changement majeur est l'appel de 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 autorisent � utiliser le handle de la fen�tre � l'int�rieur de l'appel de la fonction - Ces fonctions commuteront automatiquement. Dans notre exemple nous pourrions l'avoir fait avec:
GUISetState(@SW_SHOW, $hMainGUI)
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.