En la primera parte de este artículo vimos una introducción a AutoIt como programa para la creación de scrits para Windows y como descargar e instalar el programa. También hablamos algo de la utilidad del Windows Info y escribimos nuestro primer script.
Si quieres refrescar la memoria, puedes verlo aquí: Programando scripts con AutoIt. Mi primer script (I)
Te recuerdo que el script queríamos que mostrase un MsgBox con un texto y dos botones (Si / No) que, después de un tiempo, cerraríamos haciendo click en uno de ellos.
Nos habíamos quedado en el punto que nuestro MsgBox aparecía como sigue:

Mi primer script (continuación)
En este segundo script, dijimos que queríamos que, una vez se mostrase el MsgBox, esperase durante 4 segundos para entonces hacer click en el botón No. Por tanto, lo primero que tendremos que hacer será detectar que la ventana del MsgBox ha aparecido para comenzar a contar los 4 segundos.
Vamos a ello. Abrimos un nuevo editor para este segundo script y nos ponemos manos a la obra.
Aquí es donde nos viene muy bien el Windows Info, así que vamos a abrirlo y cuando lo tengamos, ejecutamos nuestro primer script para que se muestre la ventana del MSgBox que, de momento, se quedará abierta de forma indefinida hasta que pulsemos uno de sus botones. Ahora vamos a arrastrar el Finder Tool (la diana del Windows Info) sobre el MsgBox y ver la magia de esta herramienta. La información que nos proporciona sobre el MSgBox en la pestaña Window es la siguiente:

Vemos que el Title de la ventana es «Mi primer MsgBox» y que la clase es #32770. También nos da otra información, como su posición, tamaño, estilo, manejador (handle), etc. Esta es la información que podemos utilizar para identificar dicha ventana. Para ello, después de la instrucción que crea el MsgBox, utilizaremos la instrucción WinWait. Esta instrucción pausa la ejecución del script hasta que detecta que existe la ventana que le indiquemos. En la ayuda de AutoIt vemos su definición:

Y vemos que solo tiene un parámetro obligatorio que es «title» pero que después nos dice en la descripción de los parámetros que puede ser el titulo (title), manejador (hWnd) o clase (class) de la ventana que queramos identificar. ¿Y esto que significa? Pues significa que podríamos identificar que dicha ventana existe por todos esos medios.
Identificación por titulo
Como conocemos el título de la ventana, ya que lo hemos visto con el Windows Info, podríamos detectarla mediante el mismo de la siguiente forma:
WinWait(«Mi Primer MsgBox»)
Esto interrumpiría la ejecución del código hasta que se localizase una ventana con ese título.
Este método suele ser bastante efectivo. Además, podemos definir como queremos que se localice dicho título. Si en la ayuda haces click en el enlace «Title special definition», te contará que existen cuatro formas de localizar por el título:
- Modo 1 (por defecto): El titulo debe coincidir parcialmente, comenzando desde el principio. Podríamos buscar «Mi» o «Mi primer», por ejemplo
- Modo 2: debe coincidir alguna subcadena dentro del titulo completo. Por ejemplo, serviría decirle que busque «Mi», «Mi primer», pero también «primer»
- Modo 3: en este caso, el título debe coincidir completamente
- Modo 4: dicen que se mantiene por razones de compatibilidad con versiones previas. Mejor no usarlo
Además, todos estos modos diferencian mayúsculas de minúsculas, es decir, el modo 2 encontraría le ventana con «primer» pero no con «Primer». Para obviar esto, debemos usar los modos con el signo «–» delante.
La opción que elijamos, salvo que sea la 1, se debe especificar al principio del script con la instrucción Opt(«WinTitleMatchMode», 2). En este caso, he elegido el Modo 2 para no tener que usar todo el título.
Identificación por manejador
Hay instrucciones de Autoit, como es esta de WinWait sin ir mas lejos, que podemos ver que en la ayuda dice el valor que devuelve la función.

Para entender esto y su utilidad, vamos a poner un ejemplo. Supongamos que tenemos un script cuya función es abrir Excel. Una instrucción del script indicaría que lo abra y eso lleva un cierto tiempo. Pues bien, con WinWait, interrumpimos la ejecución del script hasta que se detectase, a través del título, que se ha abierto la ventana. Sería algo como:
run («C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE»)
WinWait («Excel»)
…. continuar el script
En este caso, indicaríamos que se abra Excel, esperaríamos a que estuviese abierto y continuaríamos con las siguientes instrucciones del script, sin mas. Sin embargo, si posteriormente nos quisiésemos referir a esta ventana de Excel por su manejador, podríamos escribir el siguiente código:
run («C:\Program Files (x86)\Microsoft Office\root\Office16\EXCEL.EXE»)
Local $ManejadorExcel= WinWait («Excel»)
…. continuar el script
Y de esta forma, en la variable local $ManejadorExcel tendríamos dicho manejador que podríamos emplear, en primer lugar para ver si la ventana se ha cargado correctamente (ves en la ayuda que en caso de error el valor devuelto sería 0) y actuar en consecuencia en caso de error y en caso de que la carga fuese correcta, para posteriormente referirnos a la ventana de Excel.
Observa que las variables deben comenzar por el carácter $ siempre.
Identificación por clase
Si la identificación por título no es efectiva por cualquier motivo, puedes usar una identificacion por clase. Has visto que el Windows Info te mostraba una clase para la ventana de MSgBox. En este caso, la instrucción debiera ser de la siguiente forma:
WinWait («[CLASS: #32770]»)
Identificación por texto
También puedes apoyarte en el texto que aparece en la ventana o control para identificarlo de forma adecuada. Para ver como, vuelva a posicionar el Finder Tool en el MsgBox, pero esta vez fíjate en la información de la pestaña VisibleText.

Ves que te está chivando todo el texto que encuentra dentro de la ventana (&Si, &No, Púlsame). Los & delante de S y N aparecen porque son las teclas por defecto que activan esos controles. Pues bien, una forma de encontrar esta ventana sería usar alguno de estos textos. ¿Y por que querría usar este método?, puedes pensar. Pues imagina que quieres «interceptar» varios MsgBox a lo largo de la ejecución de una macro para hacer distintas acciones, pero todos ellos tienen el mismo título y solo se diferencian en el texto que muestran. Pues este método te ayudará a identificarlos correctamente. Lógicamente, debe ser un texto lo suficientemente identificativo. En esta caso, deberíamos escribir la instrucción
WinWait(«»,»Púlsame»)
Obviamente, puedes combinar los métodos y escribir, por ejemplo;
WinWait(«Mi primer»,»Púlsame»)
Continuando con el script
Una vez que hemos visto como vamos a localizar que existe la ventana del MSgBox, vamos a introducir una nueva instrucción que es una variación de WinWait. Con WinWait, el script detiene la ejecución y espera a que dicha ventana exista, pero a veces, la ventana se crea (y por tanto existe), pero aún no se ha cargado del todo. Aqui entra en juego la instrucción WinWaitActive, que hace lo mismo que WinWait, pero espera a que la ventana pase a ser la activa. Los parámetros de ambas funciones son similares.
Un punto importante es que me he encontrado casos en los que esperas una ventana, se abre y existe, pero nunca pasa a ser la ventana activa, con lo que con esta instrucción, entras en una espera que nunca termina. La forma de resolverlo es esperar a que exista la ventana con WinWait y entonces entrar en un ciclo Do…Until donde la instrucción dentro del ciclo es WinActivate, que lo que hace es pasar a activa la ventana que especifiquemos por medio del script y la condición de salida del Until es WinActive, que comprueba si la ventana activa es la que queremos.
Aclarado esto, vamos a nuestro script que debe tener este aspecto:

El script saldrá del ciclo Do…Until cuando la ventana de MSgBox de nuestro primer script esté activa. A partir de aquí, queremos esperar 4 segundos. Para ello usaremos la función Sleep. Es una función muy sencilla, con un único argumento que es el tiempo de espera en milisegundos. Como queremos esperar 4 segundos, pues escribiremos Sleep(4000).
Y ya, solo nos queda después de estos 4 segundos, enviar un click al botón «No». Para esto tendremos que usar la instrucción ControlClick. SI buscamos en la ayuda como se usa, vemos lo siguiente:

Vemos que sus parámetros obligatorios son título, texto e ID del control. Como opcionales tenemos el botón (por defecto, el izquierdo), el número de clicks y las coordenadas, dentro del control, donde queremos hacer el click. Ves que las cosas empiezan a encajar. Tenemos que identificar la ventana sobre la que queremos interactuar (título, texto) y después, de alguna forma, indicar sobre que control. Con lo que sabemos hasta ahora, podemos deducir que la instrucción puede comenzar por algo así como ControlClick («primer»,»Púlsame»… (también serviría ControlClick («primer»,»»,… o ControlClick («»,»Púlsame»…) pero ¿como identificamos el botón «no»?
Seguro que ya se te habrá ocurrido que el Windows Info puede venir en nuestra ayuda. Pues así es. Con la ventana del MsgBox visible, arrastramos el Finder Tool sobre ella, pero esta vez justo encima del botón No. Veremos que sobre este aparece un recuadro en línea mas gruesa indicando que lo ha capturado. En ese momento, soltamos el botón del ratón para que quede «congelada» la información sobre el mismo y nos vamos, esta vez, a la pestaña Control. Veremos lo siguiente:

Justo a la derecha del Finder Tool, vemos la información básica que nos dice que se trata de un control de clase Button y que es la instancia número 2 de dicha clase de control dentro de la ventana. En la pestaña Control, vemos esa misma información además de muchos mas detalles. Y vemos también una línea que dice Advanced Mode: [Class: Button; INSTANCE:2]. Esta es la información que vamos a utilizar para identificarlo en la instrucción ControlClick. No es necesario escribir toda esa información. SI haces doble click en el WIndows Info sobre ella, la copia al portapapeles, con lo que, además de facilitarnos la tarea, evitaremos posibles errores de transcripción. Nuestra instrucción quedaría entonces de la siguiente forma:
ControlClick(«primer»,»»,»[CLASS:Button; INSTANCE:2]»)
Fíjate en las comillas ya que son importantes: ControlClick(«primer»,«»,«[CLASS:Button; INSTANCE:2]«). Las que van en el lugar del segundo parámetro (text) indican que no vamos a buscar ningún texto y la identificación del control también debe ir entre comillas.
Ya tenemos todo el código, que es como sigue:

Compilando los scripts
Vamos ahora a compilar los scripts para obtener los ejecutables de los mismos. Yo he llamado MsgBox.au3 al primero e Interceptor.au3 al segundo, pero usa los nombres que quieras.
La forma de compilarlos es muy sencilla. Solo tienes que ir con el Explorador de Windows a la carpeta donde los hayas guardado y, pniéndote encima de cada uno de ellos, hacer click con el botón derecho para acceder al menú contextual. Verás que aparecen las opciones de Open, para abrir el script en modo edición y tres opciones para compilarlo (Compile Script, Compile Script (x64) y Compile Script(x86)). Utiliza la primera opción para que lo compile automáticamente en la forma adecuada y ya lo tendrás todo listo para probar.
Vamos ahora a ver si realmente funciona. Para ello, primero ejecutaremos el segundo script (en mi caso Interceptor.exe) que quedará en espera de que exista la ventana de MsgBox generada por el primer script (en mi caso MsgBox.exe). Verás que aunque está en un bucle de espera, no bloquea el ordenador,y que puedes seguir trabajando con total normalidad. Cunado estés listo, ejecuta el script para que aparezca el MsgBox. Verás que se pone visible (activo) y al de 4 segundos desaparece ya que se ha enviado un click sobre el botón No.
También puede hacer otra prueba. Ejecuta primero el script del MsgBox y cuando lo veas, abre algo encima de él, de forma que quede oculto. Ejecuta ahora el script para intereceptarlo y verás que la ventana del MsgBox aparece de nuevo y se convierte en la activa. Eso lo ha hecho tu script. 4 segundos después, desaparecerá, ya que se habrá enviado el click necesario para ello.
Finalmente, te propongo que, por tu cuenta, trates de modificar el script del MsgBox para que después de recibir el click te diga si lo ha recibido en el botón Si o en el No.
Si te ha parecido interesante este artículo sobre las posibilidades de programar scripts con AutoIt, también te puede interesar ver otro artículo sobre mejora de la productividad con AutoHotkey.
También te puede interesar enlazar con la página de AutoIt directamente aquí.
Realmente interesante el tema. Se me ocurren muchas ideas para mecanizar cosas