4 votos

¿Cómo hacer que script esté fuera de foco en AppleScript?

Tengo un servicio de Automator que se compone de un único "Ejecutar AppleScript" acción. El AppleScript consiste básicamente en una serie de diálogos.

En medio del script, el script se basa en la pulsación de teclas command + C para obtener el texto enriquecido seleccionado en el script como the clipboard . Este comando de copia debe caer en medio del script, ya que el usuario podría querer pegar el portapapeles real en el diálogo inicial.

Los diálogos de AppleScript en Servicios están por defecto anclados en la parte superior de todas las ventanas; no se puede cambiar esto.

AppleScript sólo es capaz de teclear command + C cuando la aplicación subyacente está enfocada, lo que tiene sentido, teniendo en cuenta que es la aplicación subyacente -- no el diálogo script -- la que contiene el texto seleccionado.

Así que formularé mi pregunta de forma poco elegante: ¿Existe una manera de hacer que la parte superior de la ventana inmediatamente detrás del diálogo de Servicio sea gris y así hacer que la barra superior del diálogo de Servicio sea blanca, mientras que todavía no se mueve el diálogo script fuera de la vista?

No puedo guiarme por el título de la ventana o la aplicación de la ventana, porque estas variables variarán. La constante es que la ventana que quiero poner en foco siempre estará inmediatamente detrás del diálogo de Servicio.

El siguiente es un ejemplo de lo que estoy hablando:

-- Back up original clipboard contents:
set savedClipboard to the clipboard

set optionList to {"Uppercase case"}
set dialogBoxChoice to choose from list optionList with title "Change case of selection" with prompt "Choose a letter case:"

-- Copy selected text to clipboard:
tell application "System Events" to keystroke "c" using {command down}
delay 1 -- Without this, the clipboard may have stale data.
set theSelectedText to the clipboard

-- Makes the selected text all uppercase:
-- From: http://apple.stackexchange.com/a/171196/184907
set theModifiedSelectedText to (do shell script ("echo " & theSelectedText & " | tr a-z A-Z;"))

display dialog theModifiedSelectedText

-- Overwrite the old selection with the desired text:
set the clipboard to theModifiedSelectedText
tell application "System Events" to keystroke "v" using {command down}
delay 1 -- Without this delay, may restore clipboard before pasting.

-- Restore clipboard:
set the clipboard to savedClipboard

Si pones el código anterior en un Servicio activado por atajo de teclado, verás que el script fallará al tell application "System Events" to keystroke "c" using {command down} Así que.., theSelectedText será idéntico al savedClipboard siempre.

2voto

Tetsujin Puntos 23061

Esto hará lo que creo que estás buscando. He eliminado la "elección de uno" del principio, ya que no parecía relevante para el flujo de trabajo.

Estoy usando una variable activeApp para llamar a la aplicación hacia adelante después de los diálogos. Si usas los eventos del sistema para llamar a los forwards no se restablecerá la ventana frontmost.

Utilizando tell me en lugar de tell application "System Events" excepto cuando sea necesario, puede evitar la complicación de que el diálogo modal robe el foco y no regrese a su ventana principal después.

Añadiendo & quoted form of al shellscript funcionará en más casos. Algunas aplicaciones darán error sin él, incluyendo el propio Automator.

El servicio Automator recibe no input de any application
He dejado un montón de depuración, en forma de diálogos, para observar el progreso.

on run {input, parameters}
    tell me
        tell application "System Events" to set activeApp to name of first application process whose frontmost is true
        -- Back up original clipboard contents:
        set savedClipboard to the clipboard
        display dialog ("Original clip - " & (the clipboard))
        activate application activeApp
        tell application "System Events" to keystroke "c" using command down
        delay 1
        display dialog ("Copied clip - " & (the clipboard))
        set theSelectedText to the clipboard
        set theModifiedSelectedText to do shell script "echo " & quoted form of theSelectedText & " | tr a-z A-Z;"
        display dialog {"Modified clip - " & theModifiedSelectedText}
        activate application activeApp
        set the clipboard to theModifiedSelectedText
        delay 1
        tell application "System Events" to keystroke "v" using {command down}
        -- Restore clipboard:
        delay 1
        set the clipboard to savedClipboard
        display dialog ("Restored clip - " & (the clipboard))
    end tell
    set input to {}
    return input
end run

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