4 votos

¿Cómo mantener una aplicación por encima de todas las de Windows utilizando AppleScript?

Tengo un archivo .app de AppleScript que consiste básicamente en una serie de cuadros de diálogo.

Me gustaría mantener esta aplicación encima de todas las demás ventanas (incluyendo encima de cualquier nueva ventana que se cree mientras la aplicación está todavía en ejecución), hasta que el AppleScript se complete y la aplicación se cierre automáticamente.

¿Se puede anclar una ventana en la parte superior con AppleScript?

2voto

rubik's sphere Puntos 31

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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X