• 10 hours
  • Easy

Free online content available in this course.

You can get support and mentoring from a private teacher via videoconference on this course.

Got it!

Last updated on 1/7/13

TP : S'amuser avec le Bloc-notes

Log in or subscribe for free to enjoy all this course has to offer!

Maintenant les amis, ça va se corser ! Je vous résume rapidement le but de ce TP : nous allons nous amuser avec le bloc-notes ! Si si, c'est possible, je ne suis pas encore fou... :p

Le sujet

Je propose de nous amuser un peu après toutes ces lignes ingurgitées, et de changer un peu par rapport à ce qui est proposé sur les tutoriels présents sur le site du zéro.

On va donc apprendre beaucoup grâce à ce TP, et ceci d'une manière que j'espère plus intéressante pour vous qu'un chapitre normal. Je ne vais pas tourner autour du pot, la principale fonction que nous allons apprendre se nomme Send() et est très utile dans les automatisations.
On va également faire connaissance avec les fonction HotKeySet() et MouseGetPos() que vous utiliserez fréquemment dans la plupart de vos scripts AutoIt. Ce sera enfin l'occasion d'utiliser quelques nouvelles macros intéressantes.

Ce que vous devez faire

Le principe est assez simple. Nous allons développer un jeu dont le but est que le joueur arrive à fermer une fenêtre du bloc-notes. Mais ça serait beaucoup trop simple si on ne rajoutait pas quelques difficultés ! ;)
Donc il va falloir, dans l'ordre :

  • lancer le bloc-notes, attendre que la fenêtre soit affichée, et écrire dans la fenêtre les règles et le but du jeu ;

  • récupérer la position de la souris. Si l'utilisateur s'approche de la croix rouge de fermeture, on déplace la fenêtre ! ;)

  • on change le nom de la fenêtre pour afficher le nombre de tentatives ;

  • si le joueur appuie sur Ctrl + Q, on l'avertit, puis on ferme la fenêtre nous-mêmes.

Voilà, c'est tout ! ;)

Donc maintenant je vois deux cas de figure :

  • vous n'en êtes pas à votre premier langage et vous avez hâte de commencer. Dans ce cas lancez-vous, utilisez l'aide d'AutoIt plus en profondeur et revenez lire la suite quand vous aurez terminé ;

  • vous êtes plus flemmard et préférez ne pas trop travailler. Lisez l'aide qui suit sur les différentes fonctions que vous devrez utiliser et lancez-vous ensuite.

HotKeySet : définir un raccourci clavier

Nous allons voir comment définir un raccourci clavier, c'est-à-dire faire en sorte d'être capable de récupérer l'appui sur une touche par un utilisateur afin de lancer une action associée.
On utilise la fonction HotKetSet() pour cela. Cette fonction est simple d'utilisation mais fonctionne assez différemment de ce que vous avons pu voir jusqu'à maintenant.

HotKeySet ( "key" [, "function"] )

En fait, cette fonction va rester active jusqu'à la fin de votre script, mais rend la main tout de suite. C'est-à-dire qu'elle ne bloquera pas votre script, mais restera active en faisant un 'callback' - ou rappel - si un appui sur une touche est détectée. Par exemple, on fera simplement :

HotKeySet("{ESC}", "Quitter")

Ceci sera placé en début de script pour que, si l'utilisateur appui sur la touche Echap, la fonction Quitter() de notre script soit appelée.
Cette fonction va interrompre notre script et lancer la fonction associée, attendre qu'elle soit terminée, puis repartir la où on s'était arrêté précédemment.

Tu es bien gentil, mais tu le sors d'où ton {ESC} ?

Il va vous falloir chercher dans l'aide d'Autoit la fonction Send(). Nous allons voir très prochainement cette fonction, et nous verrons un tableau récapitulatif des touches. Ne vous inquietez donc pas vous saurez bientôt faire.

Voilà, vous avez maintenant les bases pour capturer l'appui sur une touche du clavier. Sachez qu'il existe des limitations à cette fonction, et nous utiliserons parfois _IsPressed() qui fonctionne différemment. L'aide concernant ces fonctions est très complète, n’hésitez pas à la visiter pour obtenir plus d'informations que ce que je viens de vous donner ici.

Simuler l'appui d'une touche du clavier

AutoIt nous permet simplement de simuler l'appui sur une touche du clavier. Nous allons pour cela utiliser la fonction Send, toute simple en apparence :

Send ( "keys" )

Ainsi, le simple code suivant permet de simuler l'appui sur les touches "a" puis "z" puis "e" :

Send ( "aze" )

Tout simplement ! Rien de plus simple. ;)
Cependant, il existe des touches spéciales qu'on ne peut pas représenter facilement, comme la touche Echap par exemple. On va donc mettre le nom de la touche dans des {} afin de l'identifier. On utilisera par exemple les mots-clefs listés ci-dessous :

  • {SPACE} : Espace

  • {ENTER} : Entrée

  • {ALT} : Alt

  • {BACKSPACE} : Retour

  • {DELETE} : Suppression

  • {UP} : Flèche Haut

  • {DOWN} : Flèche bas

  • {LEFT} : Flèche Gauche

  • {RIGHT} : Flèche Droite

  • {ESCAPE} ou {ESC} : Echap

  • {INSERT} ou {INS} : Insertion

  • {F1}, {F2}, etc...

Le code suivant va par exemple simuler l'appui sur les touches A, Z , E , Entrée, puis Echap.

Send ( "aze{ENTER}{ESC}" )

Et pour les combinaisons de touche ?

Héhé, vous ne perdez pas le Nord vous ! Pour les combinaisons de touche avec Alt ou Ctrl par exemple, on va utiliser des caractères spéciaux. Par exemple '^' représente la touche Ctrl, '+' la touche Shift et '!' la touche Alt.
Voilà par exemple un bout de script qui va appuyer simultanément sur les touches Alt et F, puis va simuler la combinaison Ctrl + Alt + A :

Send("!f")
Send("^!a")

Maintenant, si vous êtes malin vous allez me dire : "Et si je veux simuler un point d'exclamation ou une accolade gauche je fais comment ?" Hum, il suffit de les mettre dans des accolades ! ;) {!} et {{} feront l'affaire !

Cette explication se veut très succincte, l'aide concernant Send() est beaucoup plus détaillée, je vous laisse entre ses mains si vous avez des problèmes plus compliqués.

Reprenez le contrôle de votre souris

Vous pensiez être le maître de votre souris ? Vous êtes bien naïfs et insouciants... :p
Sachez qu'après cette petite partie vous en saurez plus sur votre animal de compagnie que n'importe qui.
Pour les besoins du TP, j'ai juste besoin de vous apprendre comment récupérer les coordonnées du curseur, mais je vais en profiter pour aller un peu plus loin, et donner quelques bases aux fonctions liées à votre souris.

Nous allons donc voir trois nouvelles fonctions : MouseMove, MouseClick et MouseGetPos

Déplacer le curseur avec MouseMove
MouseMove ( x, y [, speed] )

Cette fonction permet de déplacer le curseur de votre souris à la position définie par son abscisse x et son ordonnée y. Vous pouvez spécifier une vitesse de 1 (plus rapide) à 100 (plus lent). Une vitesse de 0 rend le mouvement de souris instantané. La vitesse par défaut est 10.

Voici un exemple d'utilisation :

MouseMove (@DesktopWidth/2,@DesktopHeight/2 );Déplace le curseur au milieu de l'écran.
Cliquez avec la souris avec MouseClick
MouseClick ( "button" [, x, y [, clicks [, speed ]]] )

Cette fonction permet de simuler un ou plusieurs clic(s) de souris à une certaine position et à une certaine vitesse.

Voici un exemple d'utilisation :

; Double click à 0,500
MouseClick("left", 0, 500, 2)
Connaitre la position de la souris avec MouseGetPos
MouseGetPos ( [dimension] )

Cette fonction permet de récupérer la position de votre curseur. Si vous appelez cette fonction sans argument, un tableau est retourné, le premier élément étant la position en abscisse X et le deuxième la position en ordonnée Y. Si vous n'êtes intéressé que par l’abscisse , vous pouvez appeler la fonction avec un 0 en paramètre, pour qu'elle retourne directement l’abscisse au lieu d'un tableau.

Voici un exemple d'utilisation :

$pos = MouseGetPos()
MsgBox(0, "Mouse x,y:", $pos[0] & "," & $pos[1])

Et voilà, maintenant votre souris n'a plus aucun secret pour vous ! ;)
Alors... au boulot !

Solution

Qu'est-ce que vous faites là ? Vous voulez déjà voir une solution ? Vous avez cherché au moins ?... :-°

Hum... Bon, je vous fais confiance !

On passe tout de suite à la correction :

;/////////////////////////////////////
;Libellé  : Tutoriel Site Du Zéro
;Auteur   : Malossane Timothée
;Fonction : Jouons avec le Bloc-Notes
;Date     : 18/09/2011
;//////////////////////////////////////

HotKeySet("^q","quitter") ; Si on appuie sur Ctrl+Q , on ferme le jeu
Global $quitter = false,$nbEssai = 0 ; Déclaration des variables globales

If @OSBuild >= 5513 Then ;Si Windows Vista ou supérieur, on agrandit le champ de recherche pour s'adapter au style AERO.
        $interval = 70
Else
        $interval = 30
EndIF

$Pid = Run("notepad.exe") ; On lance le bloc-notes
$Handle = WinWaitActive("[CLASS:Notepad]");On attend qu'il soit bien lancé.
Send("Ceci est un jeu créé pour le tutoriel du SiteDuZero par timmalos."&@CRLF)
Send("Le but est simple : fermer cette fenêtre !"&@CRLF)
Send("Si tu n'y arrive pas, appuie sur Ctrl+Q, nous t'aiderons"&@CRLF)


While Not $quitter ; Tant que l'utilisateur n'a pas appuyé sur Ctrl+q

        ;On récupère les coordonnées de notre fenêtre.
        $Fenetre = WInGetPos("[CLASS:Notepad]") ;WinGetPos renvoie un tableau [X, Y, Largeur, Hauteur]

        ;On calcule les coordonnées de la croix rouge.
        $FenetreX1 = $Fenetre[0]+ $Fenetre[2]-$interval
        $FenetreX2 = $Fenetre[0]+ $Fenetre[2]
        $FenetreY1 = $Fenetre[1]
        $FenetreY2 = $Fenetre[1]+ 30

        ;On récupère les coordonnées de la souris.
        $Souris = MouseGetPos()

        If ($Souris[0] >= $FenetreX1 AND $Souris[0] <= $FenetreX2) AND ($Souris[1] >= $FenetreY1 AND $Souris[1] <= $FenetreY2)Then
                $NbEssai +=1
                WinMove("[CLASS:Notepad]","",Random(1,@DesktopWidth-$Fenetre[2],1),Random(1,@DesktopHeight-$Fenetre[3],1),$Fenetre[2],$Fenetre[3]) ; On bouge la fenêtre aléatoirement
                WinSetTitle("[CLASS:Notepad]", "", "C'etait ton essai n° "&$NbEssai&". Essaye encore ! (Ctrl+q pour abandonner et quitter.)") ; On change le titre.
        EndIf

        Sleep(200)
WEnd

;Si on arrive là, c'est que l'utilisateur a appuyé sur Ctrl+q
Send("Tu t'avoues vaincu ?, je vais la fermer pour toi !"&@CRLF)
Sleep(2000)
ProcessClose($pid)


Func quitter()
        $quitter = True
EndFunc

Et voilà, tout simple comme promis.

Si vous y êtes arrivé, bravo, car je dois admettre que ce n'était vraiment pas facile sans expérience.
En fin, j'espère au moins que vous avez compris l'essentiel des nouvelles fonctions que nous avons abordées avec ce TP.

Petit supplément

Vous vous êtes bien amusés, vous avez tout compris ? Je vous propose d'essayer le code suivant :

Run("notepad.exe")
$texte = "0x2020205F5F5F5F5F205F205F20202020"& _
"202020205F5F5F5F5F20202020202020205F5F5F5F5F5"& _
"F2020202020202020202020202020200A20202F205F5F"& _
"5F5F285F29207C2020202020207C20205F5F205C20202"& _
"02020207C5F5F5F20202F202020202020202020202020"& _
"2020200A207C20285F5F5F20205F7C207C5F20205F5F5"& _
"F7C207C20207C207C5F2020205F2020202F202F20205F"& _
"5F5F205F205F5F205F5F5F20200A20205C5F5F5F205C7"& _
"C207C205F5F7C2F205F205C207C20207C207C207C207C"& _
"207C202F202F20202F205F205C20275F5F2F205F205C2"& _
"00A20205F5F5F5F29207C207C207C5F7C20205F5F2F20"& _
"7C5F5F7C207C207C5F7C207C2F202F5F5F7C20205F5F2"& _
"F207C207C20285F29207C0A207C5F5F5F5F5F2F7C5F7C"& _
"5C5F5F7C5C5F5F5F7C5F5F5F5F5F2F205C5F5F2C5F2F5"& _
"F5F5F5F5F7C5C5F5F5F7C5F7C20205C5F5F5F2F200A0A"& _
"0A20205F5F5F5F5F202020202020205F2020202020202"& _
"0202020202020205F2020202020205F2020202020205F"& _
"2020202020202020205F20202020202020205F5F5F205"& _
"F5F5F5F5F200A207C5F2020205F7C5F2020205F7C207C"& _
"5F20205F5F5F20205F205F5F285F29205F5F5F7C207C2"& _
"02020202F205C20205F2020205F7C207C5F20205F5F5F"& _
"7C5F205F7C5F2020205F7C0A2020207C207C207C207C2"& _
"07C207C205F5F7C2F205F205C7C20275F5F7C207C2F20"& _
"5F205C207C2020202F205F205C7C207C207C207C205F5"& _
"F7C2F205F205C7C207C20207C207C20200A2020207C20"& _
"7C207C207C5F7C207C207C5F7C20285F29207C207C202"& _
"07C207C20205F5F2F207C20202F205F5F5F205C207C5F"& _
"7C207C207C5F7C20285F29207C207C20207C207C20200"& _
"A2020207C5F7C20205C5F5F2C5F7C5C5F5F7C5C5F5F5F"& _
"2F7C5F7C20207C5F7C5C5F5F5F7C5F7C202F5F2F20202"& _
"05C5F5C5F5F2C5F7C5C5F5F7C5C5F5F5F2F5F5F5F7C20"& _
"7C5F7C202020202020202020202020202020202020202"& _
"0202020202020202020202020202020202020202020"
$texte = BinaryToString($texte)
WinWaitActive("[CLASS:Notepad]")
WinSetTitle("[CLASS:Notepad]", "", "Tutoriel Autoit du SiteDuZero")
Send($texte)

Testez ce code, et si vous avez bien compris ce TP, vous savez de quoi il s'agit ! ;)

Wow ! Vous êtes encore en un seul morceau après ce TP de malade ? Bien joué, vous m'épatez ! :waw:

L’automatisation n'a maintenant plus aucun secret pour vous et vous être pleinement le maître de votre ordinateur. ;)

Example of certificate of achievement
Example of certificate of achievement