• 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

Les bases de l'automatisation

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

Un nouveau chapitre théorique ! Courage, celui-là est plutôt intéressant. :p
Suivez le guide pour en savoir plus sur les automatisations...

Introduction

Un peu de culture générale ne fait jamais de mal, alors on est parti pour un tour !

Citation : Dictionnaire

Automatisation : Ensemble de procédés qui rendent l'exécution d'une tâche automatique, sans intervention de l'homme

Je ne sais pas pour vous, mais l'automatisation m'a toujours attiré. Voir son ordinateur faire des actions comme un grand donne toujours le sourire. Et si vous ne voyez pas ce que je veux dire, attendez la fin de cette partie, vous serez servis. :)

Que peut-on automatiser ?

Pratiquement tout ! Il y a, comme toujours en informatique, une multitude de façons de procéder, mais pratiquement rien ne peut nous résister.
Pour commencer, on peut automatiser des actions quotidiennes. Par exemple, se connecter sur un forum internet, vérifier les nouveaux messages, ouvrir son logiciel pour écouter de la musique à l'ouverture de session, envoyer un email à son patron à 10h00 du matin pour lui dire que vous êtes malade alors que vous êtes à Disney-land, vérifier toutes les heures que son site internet est bien en ligne, ou encore écrire un tutoriel pour débutants sur le site du zéro (rassurez vous, je n'en suis pas encore là... Mais j'y réfléchis !! :lol: ).

Dans cette partie, on va donc apprendre à manipuler les fenêtres, les processus, à faire bouger sa souris toute seule (pas en vrai sur votre bureau, hein :-° ), à écrire dans le bloc-notes, à cliquer sur un bouton, et plus encore !

Pourquoi choisir le langage Autoit ?

Hmm, bonne question. Il est vrai que pour certaines applications, on recommande des langages de bas niveau tel que le C++, alors que pour d'autres on va utiliser Java ou Python. Quand on commence à toucher à l'automatisation sous Windows, on se tourne vers Autoit. Pour avoir testé plusieurs solutions, c'est le plus rapide, le plus simple et le plus efficace.

Autoit a été créé principalement dans cette optique, et même s'il s'est bien étoffé au cours du temps, cette partie de ses fonctionnalités à toujours été son point fort.

Pour tout vous dire, il y a même certaines personnes qui utilisent Autoit dans leurs applications C++.
(Si le sujet vous interesse, vous pouvez trouver la documentation d'AutoitX dans votre 'dossier d'installation/AutoitX/AutoItX.chm')

Les BOTs

Je tiens à faire quelques précisions concernant ce qu'on appelle les bots.

Les programmes considérés comme des bots :

  • tous les programmes qui améliorent les conditions de jeu quelles qu'elles soient, au niveau d'un automatisme d'une action ou d'une facilité apportée par le programme ;

  • les bots malicieux qui peuvent entraver le bon fonctionnement d'une machine ou d'une communauté.

Les programmes qui ne sont pas considérés comme des bots (non malveillants) :

  • les automates d'installations ;

  • les automates d’analyse de log ;

  • les traitements automatiques simplifiant les routines de travail / vie de tous les jours (non en rapport avec des jeux en ligne ou assimilés).

Vous l'avez compris, si AutoIt traine une mauvaise réputation, c'est parce que sa grande facilité à faire des automatisations a été reprise par les "Script kiddies" pour automatiser leur jeu vidéo préféré (Dofus remporte la palme o_O ).

Autoit Window Info

Avant de pouvoir continuer, j'ai besoin de vous parler plus en détail d'un utilitaire fourni avec Autoit se nommant "Autoit Window Info".

À quoi sert cet outil ?

Si vous vous souvenez un peu de ce qu'on a vu précédemment, vous devez vous souvenir des handle et des controlID. Sinon, jetez un coup d'oeil.
Je vous avais dit que ces identifiants permettent de contrôler la fenêtre et les contrôles de votre GUI. Eh bien sachez que l'on peut contrôler n'importe quelle fenêtre et ses contrôles de la même manière.
Mais pour cela, il faut connaitre certaines informations de cette fenêtre. C'est là que Autoit Window Info intervient.

Comment le lancer ?

Vous pouvez le lancer très simplement via (au choix) :

  • le raccourci présent dans menu démarrer > Tous les programmes > Autoit v3 > Autoit Window Info ;

  • C:\Program Files\AutoIt3\Au3Info.exe ;

  • Ctrl+F6 dans Scite ;

  • Outils > Au3Info dans Scite.

Utilisation

Vraiment rien de bien compliqué ici, l'outil est intuitif. Il vous suffit de faire un clic gauche enfoncé sur le "Finder Tool" et de vous balader sur votre écran. Les informations seront alors affichées en fonction de la fenêtre que vous survolez, de ses contrôles, etc...

Si vous avez un script Autoit ouvert avec 'Scite4Autoit, relâchez votre clic gauche sur la fenêtre. Vous devriez obtenir quelque chose comme ceci :

Image utilisateur

Vous pouvez apercevoir plusieurs onglets, chacun regroupant des informations sur un élement différent. L'onglet 'Summary' contient toutes les informations réunies.

Nous allons tout de suite voir quelles sont les informations importantes et celles qui le sont moins.

A propos des titres de fenêtres

Maintenant que nous savons comment lancer Autoit Window Info et comment l'utiliser, je vais vous apprendre à ne regarder que les informations utiles. En effet, si vous êtes curieux, vous avez remarqué que j'ai entouré 2 valeurs dans les images ci-dessus. Vous souhaitez savoir pourquoi ? Pour cela, j'ai besoin de vous en apprendre un peu plus sur les titres de fenêtres, et ça tombe bien, on est là pour ça. ;)

Techniques de base

La première chose à savoir, c'est que la plupart des fenêtres peuvent être identifiées par leur titre ou une combinaison de leur titre et texte.

Les titres de la plupart des fenêtres sont assez évidents, par exemple "Sans titre - Bloc-notes" est le titre de l'éditeur de texte Notepad.exe et dans la plupart des cas cela suffit pour automatiser.

Prenons une fonction simple , la fonction WinExists :

WinExists ( "title" [, "text"] )

Cette fonction va simplement nous dire si la fenêtre en question existe ou non. Attention, une fenêtre peut être minimisée, cachée, déplacée en dehors de l'écran, ne pas être dans votre barre des tâches et exister pour autant.

Le titre est l'unique paramètre obligatoire pour cette fonction, le texte est optionnel. Dans certaines fonctions le paramètre texte n'est pas optionnel, si vous ne souhaitez pas en spécifier, utilisez les guillemets vides "".

Par exemple, le code suivant nous dira si au moins une fenêtre est active ou non.

If WinExists("") Then
    MsgBox(0, "", "Une fenêtre active existe")
EndIf

Et si on a plusieurs fenêtres d'une même application ouverte, comment fait-on ?

C'est très simple, on va utiliser le paramètre texte pour les différencier.
Par exemple, si une fenêtre du Bloc-notes contenait le texte "Voici un peu de texte !" l'outil Window Info indiquerait :

Image utilisateur

L'outil <AutoIt Window Info> a bien repéré le titre et le texte de la fenêtre du Bloc-notes. Tout ce que cet outil peut voir, AutoIt peut le voir aussi.
Maintenant, nous avons suffisamment d'informations pour identifier précisément cette fenêtre même si beaucoup d'autres fenêtres Bloc-notes sont ouvertes. Dans ce cas, nous utilisons :

WinExists("Sans titre - Bloc-notes", "Voici un peu de texte!")

Et voilà, maintenant vous en savez un peu plus sur les titres de fenêtres, mais on va encore compliquer, alors accrochez-vous. Ce qui a été décrit est le mode opératoire par défaut de AutoIt, mais nous allons voir des méthodes avancées lorsque tout n'est plus aussi simple.

Techniques avancées

A la place d'un simple titre, une description spéciale peux être utilisée comme paramètre pour le titre de la fenêtre.
Cette description peux être utilisée pour identifier la fenêtre par les propriétés suivantes :

  • TITLE - Le titre de la fenêtre

  • CLASS - Le nom de la classe interne à window (classname)

  • REGEXPTITLE -Le titre de la fenêtre en utilisant une expression régulière

  • REGEXPCLASS - Classname d'une fenêtre utilisant une expression régulière

  • LAST - La dernière fenêtre utilisée dans une commande précédente de AutoIt

  • ACTIVE - La fenêtre courante active

  • X \ Y \ W \ H - La position et la taille d'une fenêtre

  • INSTANCE - La première instance lorsque toutes les propriétés correspondent

Une ou plusieurs propriétés peuvent être utilisées et combinées comme ceci :

[PROPERTY1:Value1; PROPERTY2:Value2]

Si vous regardez avec <Autoit Window Info> une fenêtre du Bloc-notes, vous pourrez voir que sa classe est "Bloc-notes". On peut donc faire comme suit :

WinExists("[CLASS:Bloc-notes]", "")

De même, pour vérifier la présence de la deuxième instance d'une fenêtre dont le titre est "Ma fenêtre" et de classname "Ma Class", on ferait :

WinExists("[TITLE:Ma fenêtre; CLASS:Ma Class; INSTANCE:2]", "")
Les Handles (Hwnd)

Pour terminer, sachez qu'il est également possible de remplacer le titre par le Handle de la fenêtre. Souvenez-vous, le handle d'une fenêtre est une valeur spécifique que Windows attribue a une fenêtre chaque fois qu'elle est créée. Quand vous avez un handle, vous pouvez l'utiliser en lieu et place du paramètre de titre.
L'avantage d'utiliser les handles de fenêtre est que si vous avez plusieurs copies d'une application ouverte (qui ont le même titre/texte) vous pouvez les identifier par leur handle.

Une multitude de fonctions comme WinActive, WinGetHandle, WinList et GUICreate renvoient ce handle.
Par exemple, pour fermer la fenêtre active :

$handle = WinGetHandle("[active]")
WinClose($handle)

Manipuler un processus

On m'a souvent conseillé de mieux présenter les fonctions avant de commencer les TPs. Vous allez être servis ! :-°
On commence donc par les fonctions qui servent à manipuler des processus, et la première à connaître est la fonction Run.

Lancer une application
Run ( "program" [, "workingdir" [, show_flag[, opt_flag ]]] )

Cette fonction permet de lancer un programme externe à partir de son chemin. On ne va pas plus rentrer dans les détails pour l'instant, mais sachez qu'il est possible d'utiliser la macro @SW_HIDE pour le paramètre 'show_flag' afin de lancer le programme en mode caché.

Voici un exemple d'utilisation :

Run("notepad.exe")
Savoir si une application est lancée
ProcessExists ( "process" )

Vous pouvez utiliser le nom du processus, ou son PID.
Cette fonction retourne le PID du processus si il est en cours d’exécution.
Voici un exemple d'utilisation :

If ProcessExists("notepad.exe") Then
    MsgBox(0, "Example", "Bloc-Notes est en cours d’exécution.")
EndIf
Forcer la fermeture d'une application
ProcessClose ( "process")

Vous pouvez utiliser le nom du processus, ou son PID.
Si c'est le nom du processus qui est utilisé et que l'application a été lancée deux fois, c'est celle qui a été lancée en dernier qui sera fermée. Le PID est quant à lui unique, pas de problème.
Voici un exemple d'utilisation :

$PID = ProcessExists("notepad.exe") ; Retourne le PID ou 0 si le processus n'est pas trouvé.
If $PID Then ProcessClose($PID)

Il existe bien d'autres fonctions, je vous laisse les découvrir par vous-mêmes. ;)

Manipuler une fenêtre

Mais on va tout de même apprendre quelques fonctions qui permettent d'interagir avec les différentes fenêtres ouvertes sur votre ordinateur.

De même que pour les processus, il existe une panoplie impressionnante de fonctions qui permettent d’interagir avec les fenêtres. Nous n'en verrons ici que quelques unes, que nous allons utiliser dans le prochain TP, mais ce ne sont pas forcément les plus importantes !

WinWaitActive
WinWaitActive ( "title" [, "text" [, timeout]] )

Cette fonction est assez explicite. On va tout simplement mettre notre script en pause tant que la fenêtre ayant un certain titre et (si souhaité) un certain texte ne devient pas active.
Cette fonction va nous permettre de vérifier par exemple qu'une application lancée avec la fonction Run vue précédemment est bien lancée.

On peut également rajouter un timeout en secondes, pour éviter d'attendre indéfiniment si un problème est apparu.
Cette fonction retourne le handle de la fenêtre en question. On va donc pouvoir la contrôler directement.
Voici un exemple d'utilisation :

WinWaitActive("Bloc-notes") ; On attend que le Bloc-notes se lance.

On va rajouter la ligne suivante avant notre WinWaitActive, ou au début du script :

Opt("WinTitleMatchMode", -2)     ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase

Par défaut, Autoit utilise le début des titres pour comparer. Nous allons utiliser 2 pour signifier que l'on cherche à l'intérieur de la chaîne, et on rajoute un - pour signifier qu'on ne souhaite pas faire attention à la casse (si vous mettez Titre alors que la fenêtre contient tiTRE, ça marchera).
Bien sûr, dans votre prochaine application, vous serez libre de choisir vos paramètres comme vous le souhaitez.

WinGetPos
WinGetPos ( "title" [, "text"] )

Cette fonction nous retourne la position de la fenêtre demandée. Sa largeur, hauteur, et les coordonnées X,Y sur l'écran de son coin supérieur gauche. (C'est toujours l'origine avec Windows)

$size = WinGetPos("[active]")
MsgBox(0, "Position de la fenêtre active (x,y,largeur,hauteur):", $size[0] & " " & $size[1] & " " & $size[2] & " " & $size[3])
WinClose
WinClose ( "title" [, "text"] )

On va demander la fermeture de la fenêtre ayant le titre et le texte précisé. Attention, contrairement à tout à l'heure avec le ProcessClose(), on procède ici avec la manière de l'art. La fonction va simuler l’événement de fermeture, sans la forcer. C'est-à-dire que si l'application affiche un message à la fermeture, ce message sera affiché comme si vous aviez fermé la fenêtre. Par exemple, si vous faites un WinClose("Sans titre - Bloc-notes") et que vous aviez écrit du texte dans le bloc-notes, vous verrez le message demandant si vous souhaitez enregistrer normalement.

WinSetTitle
WinSetTitle ( "title", "text", "newtitle" )

Cette fonction permet tout simplement de changer le titre de votre fenêtre s'il ne vous plait pas :

Opt("WinTitleMatchMode", -2)     ;1=start, 2=subStr, 3=exact, 4=advanced, -1 to -4=Nocase
WinSetTitle("Bloc-notes", "", "Tutoriel Autoit du SiteDuZero")

On en a fini pour l'instant avec la théorie, passons au TP ! J'ai encore beaucoup d'autres fonctions à vous faire découvrir !

Il est temps de passer à quelque chose de concret. On commence ?

Example of certificate of achievement
Example of certificate of achievement