Aller au menu - Aller au contenu

Icône TP : S'amuser avec le Bloc-notes

Mise à jour : 10/11/2011
Difficulté : Intermédiaire Intermédiaire Durée d'étude : 2 heures Creative Commons BY-NC-SA
3 274 visites depuis 7 jours, dont 110 sur ce chapitre classé 50/786
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
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

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.

Code : Autre
1
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 :

Code : Autre
1
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.

Certaines touches ne peuvent PAS être capturées :
  • Ctrl+Alt+Suppr, combinaison réservée par Windows ;
  • F12, également réservée par Windows ;
  • la touche Win qui est gérée directement par le clavier ;
  • d'autres cas peuvent apparaître, mais nous ne les verrons pas dans ce tutoriel.

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 :

Code : Autre
1
Send ( "keys" )


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

Code : Autre
1
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.
Code : Autre
1
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 :

Code : HTML
1
2
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


Code : Autre
1
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 :
Code : Autre
1
MouseMove (@DesktopWidth/2,@DesktopHeight/2 );Déplace le curseur au milieu de l'écran.


Cliquez avec la souris avec MouseClick


Code : Autre
1
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.
Cette fonction prend la main sur le mouvement fait par l'utilisateur. N'utilisez pas cette fonction dans une boucle sans y faire très attention, sous peine de vous retrouver avec un PC inutilisable que vous serez forcés de redémarrer, car plus aucune action ne sera possible... (Ça m'est arrivé plusieurs fois ! ;) )

Voici un exemple d'utilisation :
Code : Autre
1
2
; Double click à 0,500
MouseClick("left", 0, 500, 2)


Connaitre la position de la souris avec MouseGetPos


Code : Autre
1
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 :
Code : Autre
1
2
$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 :

Code : Autre
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
;/////////////////////////////////////
;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 :
Code : Autre
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
32
33
34
35
36
37
38
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:
Chapitre précédent Sommaire Chapitre suivant

Partager

9 commentaires pour "TP : S'amuser avec le Bloc-notes"
Note moyenne : 3.56 / 4 (100 votes)
Pseudo Commentaire
Hors ligne timmalos # Posté le 29/02/2012 à 12:49:07
Avatar

Avis : Très bon

Études : INSA Lyon

Plusieurs problèmes : tout d'abord il faut attendre que Le blocs-notes soit bien ouvert. On peut utiliser WInWait.

Deuxièmement, pour envoyer la toucher ENTRER, il faut utiliser des "" avant.
Ensuite, le + sert a additionner des valeurs. Ici vous additionnez des chaines de caractères, donc le résultat vaut 0 donc tout le send envoie en réalité juste un 0. Il faut remplacer les + par des &.

Voici le code corrigé et fonctionnel:


Code : Autre
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
;/////////////////////////////////////
;Auteur : Halkevy
;Fonction : Impresssionner sa môman...
;Date : 29/02/2012
;//////////////////////////////////////
Run("notepad.exe"); on lance le bloc-note
WinWait("[CLASS:Notepad]")
;on dit ce que l'on veut écrire
$ligne1= " ____ ____ _ _ _ ______ _"
$ligne2= " / __ \ / __ \ | | | | | ||__ __| | |"
$ligne3= " | | |_|| /__\ || | | | | | | | | |"
$ligne4= " \ \ | __ || | | | | | | | | |"
$ligne5= " _ \ \ | | | || | | | | | | | |_|"
$ligne6= " | |_| | | | | || |___ | |__| | | | _"
$ligne7= " \____/ |_| |_||_____||______| |_| |_|"
WinSetTitle("[CLASS:Notepad]", "", "Salut!");on change le nom du bloc-note
Send($ligne1&"{ENTER}"&$ligne2&"{ENTER}"&$ligne3&"{ENTER}"&$ligne4&"{ENTER}"&$ligne5&"{ENTER}"&$ligne6&"{ENTER}"&$ligne7 );on écrit!

Image utilisateur
 
Hors ligne Halkevy # Posté le 29/02/2012 à 12:50:44
Avatar

Avis : Très bon

Ah encore une question; des amis veulent réaliser un jeu de plateforme... Ils m'ont demandé d'écrire le script mais là, je sèche... Est-ce possible avec AutoIT ???
Hors ligne Halkevy # Posté le 29/02/2012 à 12:52:48
Avatar

Avis : Très bon

Merci pour le coup du bloc-note,
mais du coup, je me sens nul... OUUUUUUUUUIIIIIIIIIIN
^^
Hors ligne Little Nooby # Posté le 25/03/2012 à 18:53:01
Je cause trop...
Avatar

Avis : Très bon

Ville : Namur
Pays : Belgique

@Halkevy: Ahaha, ils sont sympas tes amis. Toi tu pues le mecs qui veut faire un bot sur dofus, je ne sais pas pourquoi.

Un grand merci pour ce TP. Je n'ai plus qu'à me plonger dans la bibliothèque de AutoIt pour ce que je désire faire.

Timmalos, j'ai finit tout le tutoriel et voici mon avis : Il donne une base appréciable et surtout donne une idée de ce que l'on peut faire avec ce langage. Le tutoriel est agréable à lire. Les mini-TP entre les grand TP sont très appréciables. Et puis, un gros plus un pour la réactivité avec les questions des visiteurs :-).

A une prochaine fois dans la suite du tutoriel ou dans un autre tutoriel peut-être? :-)

Je ne me trompe jamais, je trouve des façons de ne pas faire ce que je voulais.
 
Hors ligne ShiiFu # Posté le 16/05/2012 à 16:38:32

Avis : Très bon

Ville : Meudon la forêt
Pays : France métropolitaine

Voilà mon petit supplément pour ce tutoriel. :p

Code : Autre
1
2
3
4
5
6
7
8
9
10
11
Run("notepad.exe")
$ligne2= " |_   _|   | |      __     __      \ \    / /"
$ligne6= " |_____|   |_____\___/ \_/ \___|      |__|\___/ \__,_|"
$ligne4= "   | |     | |   / _ \ \_/ / _ \     \ \/ / _ \| | | |"
$ligne1= "  _____     _                      __      __"
$ligne5= "  _| |_    | |___ (_) \   /| __/      |  | (_) | |_| |"
$ligne7= "                                                        By ShiiFu"
$ligne3= "   | |     | |    __\ \   / /__     \ \  / /__  _   _"
WinWait("[CLASS:Notepad]")
WinSetTitle("[CLASS:Notepad]", "", "Je t'aime!")
Send($ligne1&"{ENTER}"&$ligne2&"{ENTER}"&$ligne3&"{ENTER}"&$ligne4&"{ENTER}"&$ligne5&"{ENTER}"&$ligne6&"{ENTER}"&"{ENTER}"&"{ENTER}"&"{ENTER}"&"{ENTER}"&"{ENTER}"&$ligne7 )


Malheureusement je n'ai pas réussi à le passer en mode binaire sans que cela cause un problème.

Cordialement, ShiiFu

Voir tous les commentaires
Ce tutoriel a été corrigé par les zCorrecteurs.