¿Cómo mantener una aplicación sobre todas las ventanas usando AppleScript?

3

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

Me gustaría mantener esta aplicación sobre todas las demás ventanas (incluso sobre las nuevas ventanas que se crean mientras la aplicación aún se está ejecutando), hasta que AppleScript esté completo y la aplicación se cierre automáticamente.

¿Se puede colocar una ventana en la parte superior en AppleScript?

    
pregunta rubik's sphere 29.01.2017 - 00:04

1 respuesta

1

Método 1: SystemUIServer

Después de horas de buscar en línea y probar varias soluciones, he encontrado un método para mantener un AppleScript en ejecución sobre todas las ventanas. El método se proporciona en la publicación # 2 de este subproceso de MacScripter.net .

Aquí está el código:

tell application "SystemUIServer"
   activate
end tell

Coloqué todo mi código AppleScript dentro de la declaración tell anterior. Esto funcionó perfectamente en el primer diálogo, pero, desafortunadamente, esto causó un error poco después de avanzar a través del AppleScript.

Lo que tuve que hacer fue encapsular manualmente cada diálogo en su propia declaración tell . Para cada instancia de:

choose from list
display alert
display dialog

Tuve que agregar una declaración. Tengo innumerables cuadros de diálogo incrustados en el AppleScript en cuestión, por lo que tardé varias horas en completarlo.

Entonces, esta no es una gran respuesta, ya que es potencialmente muy laboriosa. Idealmente, uno podría insertar la declaración SystemUIServer solo una vez en su código y terminar con ella.

Una nota sobre el tiempo de espera predeterminado:

Si encapsula un cuadro de diálogo dentro del bloque de información anterior, de forma predeterminada, el script caducará si el usuario no hace clic en un botón dentro de 2 minutos. Cuando este tiempo se agota, el script será cancelado. El usuario recibirá el siguiente error:

  

SystemUIServer obtuvo un error: AppleEvent agotó el tiempo de espera.

(Sin embargo, aunque parezca extraño, incluso después de que el usuario cierre este cuadro de diálogo de error, el cuadro de diálogo original seguirá estando anclado en la parte superior hasta que el usuario haga clic en un botón del cuadro de diálogo.)

Aquí está la descripción relevante de documentación de AppleScript para with timeout :

  

Cuando un comando no se completa en el tiempo asignado (ya sea el valor predeterminado de dos minutos o el tiempo establecido por una declaración 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 el script continúe, puede ajustar las declaraciones en una declaración de prueba. Sin embargo, si la secuencia de comandos puede enviar un comando para cancelar una operación prolongada ofensiva después de que el tiempo de espera dependa de la aplicación que ejecute 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

Una 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 "" ).

Mientras el cuadro de diálogo se mantiene sobre todas las demás ventanas, si el usuario hace clic en cualquier lugar fuera de los límites del cuadro de diálogo, el usuario no podrá escribir texto en el cuadro de texto. El cursor de texto parpadeante desaparecerá permanentemente.

La barra superior del cuadro de diálogo se vuelve blanca inmediatamente cuando el usuario hace clic fuera del cuadro de diálogo. No es posible hacer que la barra vuelva al color gris oscuro (que refleja un estado activo / en primer plano), de modo que se pueda escribir el texto.

El usuario aún podrá presionar cualquier botón en el cuadro de diálogo, pero la función principal del cuadro de diálogo, es decir, para obtener una entrada de texto del usuario, se verá seriamente obstaculizada.

En resumen, no recomiendo incluir cuadros de diálogo de entrada en un bloque SystemUIServer tell.

Método 2: aplicación FastScripts

Otra forma de mantener cada diálogo de un archivo AppleScript fijado sobre todas las demás ventanas es usar una aplicación de terceros llamada FastScripts para activar los archivos de script. FastScripts mantiene todos los cuadros de diálogo fijados en la parte superior de forma predeterminada, lo que es muy útil. Ni siquiera sé si esta función se puede desactivar (si desea desactivarla; yo no).

FastScripts puede iniciar un archivo .scpt a través de un atajo de teclado personalizado o manualmente (simplemente haga clic en el icono de FastScripts en la barra de menú para ver una lista desplegable de sus scripts).

(Sé que cuando hice esta pregunta originalmente, especifiqué que AppleScript se guardó como un archivo .app. Sin embargo, 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 no es necesario editar un bit de su código AppleScript para que se implemente el efecto deseado. FastScripts hace todo el trabajo duro.

    
respondido por el rubik's sphere 29.01.2017 - 10:35

Lea otras preguntas en las etiquetas