¿Por qué mi servicio Automator funciona en Automator pero no cuando se llama desde el SO?

4

Hice un servicio de Automator que ejecuta un Applescript con el Run Applescriptmódulo. Este es el guión:

# 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 -> Runtodo funciona como debería. Sin embargo, cuando abro el servicio desde la barra de menú, es decir, en Safari, al ir a Safari -> Services -> script namenada sucede. No hay nada escrito en la consola, por lo que no puedo entender por qué el servicio no funciona. ¿Cómo puedo rastrear el error y hacer que el servicio se ejecute fuera de Automator?

Saaru Lindestøkke
fuente
Hola, ¿Es esto para la pantalla de bloqueo
markhunte
Sí lo es. He visto que su comentario sobre este método es impredecible y sospecho que esa es la razón por la que no funciona.
Saaru Lindestøkke

Respuestas:

2

¿Qué está destinado a hacer ⌃F9? Esto funcionó para mí 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

Puede 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, existen varios problemas con el uso de los servicios de Automator para asignar accesos directos a los scripts. Ver esta pregunta . Si ejecuta el servicio con un acceso directo que tiene teclas modificadoras, es posible que no haya tiempo suficiente para liberarlas antes de que el código clave ordene.

También podría 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
Lri
fuente
1

Usando la herramienta adecuada para el trabajo correcto

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

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

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

  4. AppleScript pretendía que Apple fuera una interfaz de usuario alternativa, una alternativa al mouse y al teclado que usa AppleEvents para realizar la Comunicación de aplicaciones entre procesos (IAC). Creo que es posible que desee utilizar AppleScript y Automator Services para proporcionarle una GUI con la que trabajar, pero me parece probable que deba usar algo de nivel inferior a AppleScript y AppleEvents para lo que está haciendo.

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

--- Editar ---

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

  1. Sugerí que pusiera algunas llamadas a "pitido" en su AppleScript para depurar si su script incluso se estaba llamando o no. Lo intenté y no funcionó.

Encontré el siguiente enlace que habla sobre hacer su propia función de registro. Creo que eso funcionará mejor. http://hints.macworld.com/article.php?story=2004121710493371

Aquí está mi versión del código para hacer su propio registro usando AppleScript, de lo que deduzco, 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 difícil de entender. Esta función de registro funciona para mí, en realidad 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 de iniciar sesión, para depurar, puede intentar usar algunos caracteres visibles como "A", "B" y "C" y puede 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 desatar 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, ya que estoy tratando de compartir enlaces con Dropbox.

https://www.dropbox.com/s/jm3smqa4g5v2k33/KeyboardShortcuts.png

¿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 cambiar la tecla control-F8 en los atajos de teclado en las Preferencias del sistema) y en Safari, obtuve una tecla de matriz, pero el teclado no se bloqueó. ¿Requiere eso una pieza de software adicional para que esto funcione?

[email protected]

--- Editar ---

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

página de manual para el comando del automatizador http://learnbymac.com/doc/unix/automator.man.html

--- Editar ---

Tengo algunas ideas más para ti:

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

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

http://learnbymac.com/images/screen_shots/StickyKeys.png

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

http://kaydell.us/learnbymac/images/screen_shots/DisplayPressedModifierKey.png

  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. Parecen tener menos soporte para Mac ahora, pero podría buscar en Google "Alternativas a QuicKeys" si eso funcionara para que otro programa maneje la definición de los equivalentes del teclado.

PD: acabo de desactivar todas esas preferencias de las Preferencias del sistema de accesibilidad, no puedo soportar usarlas (tal vez algunas estarían bien, pero creo que las "Teclas adhesivas" estaban causando que mi Bloq Mayús se quedara escribiendo todo en mayúsculas . :().

http://kaydell.us/learnbymac/images/screen_shots/DisplayPressedModifierKey.png

Sería mejor usar Spark.app para manejar equivalentes de teclas de comando
http://www.shadowlab.org/Software/spark.php

Kaydell
fuente
Esto no es realmente una respuesta a la pregunta. Más un comentario
markhunte
OKAY. Agregué a mi respuesta.
Kaydell