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

4

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

En la mitad del script, el script se basa en el comando key command + C para obtener el texto enriquecido seleccionado en el script como the clipboard . Este comando de copia debe estar en el medio de la secuencia de comandos, ya que el usuario podría pegar el portapapeles real en el cuadro de diálogo inicial.

Los cuadros de diálogo de AppleScript en Servicios se fijan por defecto en todas las ventanas; no puedes cambiar esto.

AppleScript solo puede pulsar ⌘ comando + C cuando la aplicación subyacente está enfocada, lo cual tiene sentido, considerando que es la aplicación subyacente, no la Diálogo de script: que contiene el texto seleccionado.

Por lo tanto, pondré mi pregunta poco a poco: ¿Hay alguna forma de hacer que la parte superior de la ventana que está inmediatamente detrás del cuadro de diálogo de Servicio en gris se convierta en la barra superior del cuadro de diálogo de Servicio en blanco, sin mover el cuadro de diálogo del script? fuera de la vista?

No puedo ir 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 enfocar siempre estará detrás del cuadro de diálogo 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 coloca el código anterior en un Servicio activado por un método abreviado de teclado, verá que la secuencia de comandos fallará a tell application "System Events" to keystroke "c" using {command down} ; por lo tanto, theSelectedText será idéntico al savedClipboard cada vez.

    
pregunta rubik's sphere 14.02.2017 - 06:55

1 respuesta

2

Esto hará lo que creo que estás buscando. Eliminé la 'elección de uno' desde el principio ya que no parecía relevante para el flujo de trabajo.

Estoy usando una variable activeApp para llamar a la aplicación reenviar después de los cuadros de diálogo. Si usa Eventos del sistema para llamar hacia adelante, no se restaurará la ventana frontal.

Al usar tell me en lugar de tell application "System Events" , excepto donde sea necesario, puede evitar la complicación del diálogo modal robando focus & no volverá a su ventana frontal más adelante.

Agregar & quoted form of al shellscript funcionará en más casos. Algunas aplicaciones tendrán un error sin él, incluido el propio Automator.

El servicio Automator recibe no input de any application
Me he dejado en 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
    
respondido por el Tetsujin 14.02.2017 - 12:24

Lea otras preguntas en las etiquetas