Automatiser vos applications avec la DLL AutoItDLL
SOMMAIRE
I Introduction
II Le téléchargement de la Bibliothèque
III Les fichiers d’aide associée à la Bibliothèque
IV Utilisation de ces fonctions
V Conclusion
I Introduction
Je remets au goût du jour un ancien tutoriel que j’avais écrit sur cet outil fort sympathique qui est AutoItDll qui en est à la version 3. Cela mérite donc un petit rafraichissement. Je vous rappelle que cet outil permet de prendre le contrôle d'une application externe. Cette librairie est un freeware et elle est développée par la société HiddenSoft. La version DLL permet d'intégrer directement les fonctions dans les fichiers programmes de votre application. Cette version fournit de même un outil sous forme d’interface graphique. Avec cet outil vous allez pouvoir automatiser un certain nombre d'actions, comme l' appui sur une touche de clavier, les événements liés à la souris (clique, double clique, etc...), envoyer des textes complet, mais aussi la gestion des fenêtres (minimiser, agrandir, remplissage des zones de texte, gestion du temps d'attente, etc...) . Donc cette bibliothèque ne se limite pas à lancer un exe, c'est un outil assez complet. Je vais vous expliquer maintenant comment cette bibliothèque fonctionne sous Delphi, avec un petit exemple d’automatisation de l’application bien connue, Notepad.
II Prérequis
Avant de commencer il faut télécharger la bibliothèque pour pouvoir l'utiliser. Pour ce faire il faut se rendre sur le site de Hiddensoft. Je vous conseille de télécharger la version « Full Installation », comme cela vous aurez le droit à l’éditeur de script et le convertisseur de script en exécutable. Ces deux outils ne seront pas abordés dans ce tutoriel.Vous allez d’abord créer l’interface graphique avec des composants VCL voici à quoi elle devrait ressembler :
Elle est très simple à réaliser et ne nécessite aucun paramétrage particulier, je vous donne quand même le nom que j’ai donné à certain des composants les plus importants :
- Un composant de type TEdit nommé txtTitle qui permettra de récupérer le titre associé à la fenêtre de l’application Notepad.
- Un composant de type TEdit nommé txtHeight qui permettra de récupérer la hauteur de la fenêtre de l’application.
- Un composant de type TEdit nommé txtWidth qui permettra de récupérer la largeur de la fenêtre de l’application.
- Un composant de type TEdit nommé txtPosX qui permettra de récupérer la position verticale de la fenêtre de l’application.
- Un composant de type TEdit nommé txtPosY qui permettra de récupérer la position horizontale de la fenêtre de l’application.
- Un composant de type TMemo nommé Memo1 pour afficher le texte retourné par l’application Notepad.
Une fois le package téléchargé et installé il suffit d’importer la bibliothèque de type AutoItX3.dll. Pour ce faire il suffit d’aller dans le menu « Composant » puis dans « Importer un composant ». Sélectionnez bien ensuite l’option « Importer une bibliothèque de types ». Dans la liste des bibliothèques, sélectionnez bien la bibliothèque « AutoItX3.dll ». Dans la page qui suit il suffit de sélectionner le répertoire dans lequel vous souhaitez créer le fichier résultant .tlb. Vous pouvez le créer dans le répertoire de votre projet ou dans l’arborescence de votre projet.Il suffit ensuite ensuite de référencée la nouvelle bibliothèque de type dans la clause uses de votre unité associée à votre fiche comme ceci :
Uses …, AutoItX3Lib_TLB, …
Nous allons donc entrer dans le vif du sujet en programmant une petite application ouvrant une fenêtre Notepad, puis on verra ensuite comment envoyer du texte à cette application, et enfin à partir de notre application Delphi nous récupérerons quelques informations concernant la fenêtre ouverte Notepad.
III Les fichier d’aide associé à la bibliothèque
Avant de commencer à coder il serait je vous recommande de jeter un coup d’œil sur la documentation très complète de cet outil, pour avoir une vision plus large de la richesse. Il est important de consulter le fichier d'aide associé. Pour ce faire, c'est simple il suffit d'ouvrir le fichier d'aide associé AutoItX.chm dans le répertoire AutoItX :
Comme vous pouvez le constater vous pouvez l’utiliser avec un grand nombre d’environnement de développement et de langage.IV Codage de l’applicationDans un premier temps nous allons développer les différentes étapes nous permettant d’ouvrir une nouvelle fenêtre de l’application Notepad.
Cette opération est définie dans la procédure associée au bouton « Ouverture Notepad ».
procedure TForm1.btnCreationClick(Sender: TObject);begin
//Création d'une instance d'objet d'automatisation AutoXIt3
autoObj := TAutoItX3.Create(Self);
//Lancement de l'application Notepad en appelant son exécutable et
//en affichant la nouvelle fenêtre
autoObj.Run('notepad.exe', '',autoObj.SW_SHOW);
//Permet de laisser active la fenêtre Notepad ouverte pendant 500 millisecondes
autoObj.WinWaitActive('[CLASS:Notepad]', '', 500);
//Permet d'activer le focus sur la fenêtre
autoObj.WinActivate('Sans titre', '');
Button1.Enabled := True;
Button2.Enabled := True;
end;
Comme on peut le constater pour pouvoir utiliser les fonctions de la dll il faut dans un premier temps créer un objet de type TAutoItX3. Puis avec la méthode de classe Run on est en mesure d’exécuter l’application Notepad en appelant son exécutable. Le paramètre qui suit demande d’afficher la fenêtre à sa création. D’autres paramètres existent comme SW_MAXIMIZE ou SW_MINIMIZE pour qu’elle s’affiche sur toute la taille de l’écran, ou en mode réduit.
La ligne de code suivante n’a pas trop d’importance dans l’exécution de la procédure mais c’est pour vous la montrer que je l’ai mise elle permet d’instaurer un délai d’attente avant que la fenêtre soit active, aucun intérêt ici elle l’est déjà !!!La procédure WinActivate permet de garder le focus sur la fenêtre créée.
Les deux lignes suivantes n’ont pas beaucoup d’importance, c’est juste une question d’interface et de logique on n’envoie pas du texte à une fenêtre qui n’existe pas au risque même d’intégrer le texte dans votre éditeur de texte Delphi.
Voyons maintenant comment envoyer du texte à notre fenêtre ainsi créée. Voici la procédure permettant d’envoyer du texte dans le contenu de la fenêtre Notepad.
procedure TForm1.Button1Click(Sender: TObject);begin
//Permet d'activer le focus sur la fenêtre
autoObj.WinActivate('Sans titre', '');
//Permet d'envoyer du texte dans le corps de la fenêtre
autoObj.Send('Hello Notepad', 0);
//Permet d'exécuter une tempo avant l'exécution de la prochaine action
autoObj.Sleep(500);
//Permet d'envoyer une seconde ligne de texte
autoObj.Send('{ENTER} Voici la deuxième ligne de texte', 0);
end;
Comme vous pouvez le constater l’envoi de texte est très simple à réaliser il suffit d’utiliser la méthode Send qui permet prend en argument la chaîne de caractère. A noter que si vous voulez insérer un retour à la ligne il suffit d’employer la commande {ENTER}.Il est possible d’initier une temporisation entre chaque envoi de chaîne de caractère avec la procédure Sleep, qui dans notre cas permet d’attendre un délai de 0,5 seconde.
Pour clore ce tutoriel on va voir maintenant comment récupérer des données issues de l’application Notepad. En effet il est possible de réaliser l’acquisition de données issues d’une application cible. Dans notre cas on souhaite récupérer quelques informations concernant le titre de l’application, les dimensions de la fenêtre ainsi que sa position, et pour finir on récupérera le texte issu de la fenêtre.Voici la procédure associée :
procedure TForm1.Button2Click(Sender: TObject);
var strText, strWidth, strHeight, strPosY, strPosX : string;
width, height, posY, posX : integer;
begin
autoObj.WinActivate('Sans titre', '');
strText := autoObj.WinGetTitle('[CLASS:Notepad]', '') ;
//autoOBj.ControlFocus('Bloc', )
txtTitle.Text := strText;
width := autoObj.WinGetClientSizeWidth('[CLASS:Notepad]','');
strWidth := IntToStr(width);
txtWidth.Text := strWidth;
height := autoObj.WinGetClientSizeHeight('[CLASS:Notepad]','');
strHeight := IntToStr(height);
txtHeight.Text := strHeight;
posX := autoObj.WinGetPosX('[CLASS:Notepad]','');
strPosX := IntToStr(posX);
txtPosX.Text := strPosX;
posY := autoObj.WinGetPosY('[CLASS:Notepad]','');
strPosY := IntToStr(posY);
txtPosY.Text := strPosY;
strText := autoObj.WinGetText('[CLASS:Notepad]','');
Memo1.Text := strText;
autoObj.WinWaitActive('[CLASS:Notepad]', '', 500);
autoObj.WinClose('Sans titre', '')
end;
Comme on peut le constater la classe associée à l’objet autoObj nous fournit tout un arsenal de méthode pour arriver à nos fins. La méthode de classe WinGetTitle permet de récupérer le titre d’une application à un instant donné, L’utilisation de la commande [CLASS:notepad] permet d’appeler l’application nommée par son nom de classe (classname en anglais). Parmi les autres paramètres que vous pouvez utiliser il y a [ACTIVE] qui permet d’utiliser la fenêtre qui est actuellement active. [REGEXCLASS] pour récupérer un nom de classe en utilisant les expressions régulières, pour plus d’informations sur ce sujet je vous invite à aller voir ici. Vous pouvez remplacer cette information (titre), par le titre exact de l’application si vous êtes en possession de cette information.Pour obtenir la largeur, la longueur, la position verticale et horizontale de la fenêtre vous avez à votre disposition les méthodes respectives suivantes :
- WinGetClientSizeWidth : qui prend argument le titre de la fenêtre, le deuxième argument est une chaîne vide par défaut;
- WinGetClientSizeHeight : idem pour les arguments, elle renvoie un entier donnant la hauteur de la fenêtre ;
- WinGetPosX et WinGetPosY : idem pour les arguments, elles renvoient les positions verticale et horizontale de la fenêtre.
Enfin la méthode de classe WinGetText permet de récupérer tout le texte issu de l’application Notepad sous forme d’une chaîne de caractères unique. Il suffit de placer le texte renvoyé dans notre composant de type TMemo ou de l’analyser par exemple. Je vous invite à rajouter du texte dans la fenêtre Notepad avant de cliquer sur le bouton. Vous verrez que l’on récupère bien tout le texte et pas seulement celui que vous aviez envoyé au début.
La dernière méthode, WinClose, permet de fermer l’application que l’on a ouverte.
V Conclusion
A travers ce tutoriel on a pu voir qu’avec la version 3 la bibliothèque s’enrichit et devient un véritable couteau suisse pour développer des fonctions d’automatisation de tâches dans vos applications Delphi.Un nouvel outil graphique est également disponible dans le package. Je vous conseille donc de faire un tour d’horizon de cet outil qui permet de faire pas mal de chose.