Método 1: SystemUIServer
Después de horas de búsqueda en Internet y de probar varias soluciones, he encontrado un método para mantener un AppleScript en ejecución sobre todos los Windows. El método se proporciona en el post #2 de este hilo de MacScripter.net .
Aquí está el código:
tell application "SystemUIServer"
activate
end tell
Coloqué todo mi código AppleScript dentro de la anterior tell
declaración. Esto funcionó perfectamente en el primer diálogo, pero, por desgracia, causó un error poco después de avanzar en el AppleScript.
Lo que tuve que hacer fue encapsular manualmente cada diálogo en su propio tell
declaración. Para cada instancia de:
choose from list
display alert
display dialog
Tuve que añadir una declaración. Tengo innumerables diálogos incrustados en el AppleScript en cuestión, así que me llevó varias horas completarlo.
Por lo tanto, esta no es una gran respuesta, ya que es potencialmente muy laboriosa. Lo ideal sería insertar la sentencia SystemUIServer una sola vez en el código y listo.
Nota sobre el tiempo de espera por defecto:
Si encapsulas un diálogo dentro del bloque tell anterior, por defecto, el script agotará el tiempo de espera si el usuario no hace clic en un botón en 2 minutos. Cuando se agote el tiempo de espera, el script se cancelará. El usuario recibirá el siguiente error:
SystemUIServer tiene un error: AppleEvent agotado.
(Sin embargo, curiosamente, incluso después de que el usuario cierre este cuadro de diálogo de error, el cuadro de diálogo original seguirá anclado en la parte superior hasta que el usuario haga clic en un botón del cuadro de diálogo).
Esta es la descripción pertinente de la Documentación AppleScript para with timeout
:
Cuando un comando no se completa en el tiempo asignado (ya sea el predeterminado de dos minutos, o un tiempo establecido por un with timeout
), AppleScript deja de ejecutar el script y devuelve el error "event timed out"
. AppleScript no cancela la operación-simplemente detiene la ejecución del script. Si desea que script continúe, puede envolver las sentencias en una sentencia try. Sin embargo, que su script pueda enviar un comando para cancelar una operación larga después de un tiempo de espera depende de la aplicación que esté ejecutando el comando.
Por lo tanto, si no desea que el tiempo de espera afecte a sus diálogos, haga lo siguiente:
tell application "SystemUIServer"
with timeout of 999999 seconds
activate
display dialog "Hello World"
end timeout
end tell
Nota sobre los diálogos de entrada:
El método 1 no funciona correctamente con un display dialog
que tiene un campo de texto (es decir, default answer ""
).
Aunque el cuadro de diálogo se mantiene encima de todas las demás ventanas, si el usuario hace clic en cualquier lugar fuera de los límites del cuadro de diálogo, no podrá escribir texto en él. El cursor de texto parpadeante desaparecerá permanentemente.
La barra superior del cuadro de diálogo se vuelve inmediatamente blanca cuando el usuario hace clic para salir del cuadro de diálogo. No es posible conseguir que la barra vuelva al color gris oscuro (que refleja un estado de primer plano/activo), para poder escribir texto.
El usuario podrá seguir pulsando cualquier botón del cuadro de diálogo, pero la función principal del mismo, es decir, obtener una entrada de texto del usuario, se verá seriamente obstaculizada.
En resumen, no recomiendo incluir diálogos de entrada en un SystemUIServer
tell block.
Método 2: Aplicación FastScripts
Otra forma de mantener todos los cuadros de diálogo de un archivo AppleScript anclados sobre el resto de Windows es utilizar una aplicación de terceros titulada FastScripts para activar los archivos script. FastScripts mantiene todos los diálogos en la parte superior por defecto, lo cual es muy útil. Ni siquiera sé si esta característica se puede desactivar (si quisiera desactivarla; yo no lo hago).
FastScripts puede iniciar un archivo .scpt mediante un atajo de teclado personalizado o manualmente (basta con hacer clic en el icono FastScripts de la barra de menús para que aparezca una lista desplegable de sus scripts).
(Sé que cuando hice esta pregunta originalmente, especifiqué que el AppleScript se guardaba como un archivo .app. Pero, un archivo AppleScript .app se puede convertir en un archivo AppleScript .scpt fácilmente y en poco tiempo).
Por supuesto, este método es atractivo porque uno no necesita editar ni un bit de su código AppleScript para que se implemente el efecto deseado. FastScripts hace todo el trabajo duro.