¿Por qué mi servicio de Automator funciona en Automator pero no cuando se lo llama desde el sistema operativo?

4

He creado un servicio Automator que ejecuta un Applescript con el módulo Run Applescript . Este es el script:

# Press ^F8
tell application "System Events"
    key code 100 using control down
end tell

delay 0.1

# Press "down"
tell application "System Events"
    key code 125
end tell

delay 0.1

# Press ^F9
tell application "System Events"
    key code 101 using control down
end tell

Cuando tengo el servicio abierto en Automator y presiono Workflow -> Run , todo funciona como debería. Sin embargo, cuando abro el servicio desde la barra de menú, es decir, en Safari, yendo a Safari -> Services -> script name no ocurre nada. No se escribe nada en la consola, por lo que no puedo entender por qué el servicio no funciona. ¿Cómo puedo localizar el error y hacer que el servicio se ejecute fuera de Automator?

    
pregunta Saaru Lindestøkke 14.06.2013 - 19:37

2 respuestas

2

¿Qué debe hacer ⌃F9? Esto me funcionó cuando lo envolví en un servicio:

tell application "System Events"
    key code 100 using control down -- ^F8
    delay 0.1
    key code 125 -- down
    key code 125
    keystroke return
end tell

Puedes intentar ejecutar el flujo de trabajo con automator -v :

$ automator -v ~/Library/Services/lock.workflow/
Starting Automator…
Run AppleScript is running

Run AppleScript is finished

The Automator workflow has completed.

Sin embargo, hay varios problemas con el uso de los servicios de Automator para asignar accesos directos a scripts. Consulte esta pregunta . Si ejecuta el servicio con un acceso directo que tiene teclas modificadoras, es posible que no haya suficiente tiempo para liberarlas antes de los comandos del código de la tecla.

También puedes usar un script como este:

tell application "System Events" to tell process "SystemUIServer"
    tell (menu bar item 1 where description is "Keychain menu extra") of menu bar 1
        click
        click menu item 1 of menu 1
    end tell
end tell
    
respondido por el user495470 15.06.2013 - 20:19
1

Uso de la herramienta adecuada para el trabajo adecuado

  1. Puede intentar agregar un pitido a su AppleScript para escuchar si se está llamando.

  2. He tenido servicios que no se han ejecutado antes cuando hay dos cosas que intentan usar las mismas combinaciones de teclas. Puede intentar agregar más claves modificadoras para hacer que un conflicto sea menos probable (para pruebas y depuración).

  3. Cuando veo un código que depende de llamar al comando llamado "retraso", me da una sensación de que el código no siempre va a funcionar.

  4. Apple tenía la intención de que AppleScript fuera una interfaz de usuario alternativa, una alternativa al mouse y el teclado que usa AppleEvents para realizar la Comunicación de aplicación entre procesos (IAC). Creo que es posible que desee utilizar los servicios de AppleScript y Automator para proporcionarle una GUI para trabajar, pero me parece que debería usar algo de nivel inferior que AppleScript y AppleEvents para lo que está haciendo.

Por lo tanto, estoy hablando de agregar algún tipo de script de shell a la mezcla para que todo funcione de manera confiable.

--- Editar ---

Ya que @markhunte ha criticado mi respuesta por no ser realmente una respuesta, intentaré hacerlo mejor.

  1. Le sugerí que pusiera algunas llamadas a "beep" en su AppleScript para depurar si su script estaba siendo llamado o no. Intenté eso y no funcionó.

Encontré el siguiente enlace que habla sobre la creación de su propia función de registro. Creo que funcionará mejor. enlace

Aquí está mi versión del código para hacer su propio registro usando AppleScript, de lo que recojo, la función de registro que está integrada en AppleScript solo muestra los resultados en la parte inferior de las ventanas del editor de AppleScript, y creo que el registro del sistema es dificil de entender Esta función de registro funciona para mí, la he probado:

on logToFile(themessage)
    if themessage is equal to "" then
        set theLine to ""
    else
        set theLine to (do shell script "date  +'%Y-%m-%d %H:%M:%S'" as string) & " " & themessage
    end if
    do shell script "echo " & theLine & " >> ~/Library/Logs/AppleScript-events.log"
end logToFile

on run {input, parameters}

    logToFile("")
    logToFile("Entering Lock Keyboard Service")

    set F8 to 100
    set F9 to 101
    set DOWN_ARROW to 125

    # Press ^F8
    logToFile("About to simulate control-F8")
    tell application "System Events"
        key code F8 using control down
    end tell

    delay 0.1

    # Press "down"
    logToFile("About to simulate down-arrow")
    tell application "System Events"
        key code DOWN_ARROW
    end tell

    delay 0.1

    # Press ^F9
    logToFile("About to simulate control-F9")
    tell application "System Events"
        key code F9 using control down
    end tell

    logToFile("Exiting Lock Keyboard Service")

    return input
end run

Envolví el código en un

on run
end run

porque el código parecía funcionar mejor para mí de esa manera.

Además del registro, para depurar, puedes intentar usar algunos caracteres visibles como "A", "B" y "C" y puedes ver si se están escribiendo en Safari.

Una idea más para ti. Cuando probé el script por primera vez, la tecla F8 estaba vinculada a algo. Tuve que ir a Preferencias del sistema > Teclado > Atajos de teclado y desate la combinación de teclas ^ F8 de lo que estaba vinculado. (Esto es como lo que dije en mi primera respuesta, que creo que tenía algunas buenas ideas como probar diferentes combinaciones de teclas).

Aquí hay un enlace a una captura de pantalla. Está en mi carpeta pública de Dropbox. Avíseme si puede verlo cuando estoy probando compartir enlaces usando Dropbox.

enlace

¿Qué es lo que estás tratando de hacer? ¿Bloquear un teclado con esta secuencia de combinaciones de teclas?

El flujo de trabajo se ejecutó para mí en Safari (después de que cambié la tecla control-F8 en los Atajos de teclado en las Preferencias del sistema) y en Safari, obtuve una clave de matriz descendente, pero el teclado no se bloqueó. ¿Requiere eso un software adicional para que esto funcione?

[email protected]

--- Editar ---

Agregué la página del manual para el comando "automator" a mi sitio web que está en su infancia.

página man para el comando automator enlace

--- Editar ---

Tengo algunas ideas más para ti:

  1. En las Preferencias del sistema, existen algunas preferencias para habilitar funciones que le ayudan (al menos durante la depuración).

A. Hay "teclas adhesivas" que permiten que una tecla modificadora se pegue y no se vaya tan rápido, que podría ayudar. No lo sé.

enlace

B. Thee es una opción para mostrar una imagen en la pantalla (y reproducir el sonido) cuando se detecta una tecla modificadora.

enlace

  1. Podría usar un programa especialmente diseñado para manejar la definición de combinaciones de teclas. Hace años, solía usar un programa llamado QuicKeys. Parece que ahora tienen menos compatibilidad con Mac, pero podría buscar en Google "Alternatives to QuicKeys" (Alternativas a QuicKeys) si eso le ayudara a tener otro programa que defina los equivalentes del teclado.

PD: acabo de desactivar todas esas preferencias de las Preferencias del Sistema de Accesibilidad, no soporto su uso (tal vez algunas estén bien, pero creo que las "Teclas Adhesivas" estaban causando que mi Bloqueo de mayúsculas se quedara con la escritura de todo en mayúsculas. :().

enlace

Podría ser mejor usar Spark.app para manejar equivalentes de la tecla de comando
enlace

    
respondido por el Kaydell 23.06.2013 - 02:35

Lea otras preguntas en las etiquetas