1 votos

AppleScript - No se puede eliminar el retraso después de hacer clic

Soy muy nuevo en la creación de scripts y en el uso de AppleScript. Estoy en MacOS 10.14. He estado trasteando con él haciendo unos cuantos scripts para automatizar los clics en los elementos de la barra de menú de Apple y de terceros.

Tengo escrito el siguiente script que hace clic en un determinado elemento de la barra de menús, pulsa el down arrow y pulsa la tecla return clave.

El problema es que el clic parece estar creando un retraso de 5-6 segundos antes de que las pulsaciones de las teclas puedan dispararse. He buscado una solución pero sólo he encontrado un par de posts que hablan del problema. Ambos dicen que la solución es envolver el click comando en ignoring application responses y end ignoring sin embargo, eso no parece resolver el problema para mí.

También busqué el comando de retardo e intenté especificar un retardo de 1 segundo, pero tampoco funcionó. Sólo añade otro segundo de retraso al ya existente de 5-6 segundos.

El código que tengo es:

tell application "System Events"
    tell process "Enjoyable"
        click (menu bar item 1 of menu bar 2)
        key code 125
        key code 36
    end tell
end tell

Con la ignore declaraciones, he escrito:

tell application "System Events"
    tell process "Enjoyable"
        ignoring application responses
            click (menu bar item 1 of menu bar 2)
        end ignoring
        key code 125
        key code 36
    end tell
end tell

Con la delay declaración, he escrito:

tell application "System Events"
    tell process "Enjoyable"
        click (menu bar item 1 of menu bar 2)
        delay 1
        key code 125
        key code 36
    end tell
end tell

¿Qué otras opciones podría probar para eliminar el retraso entre el clic y la pulsación de las teclas?

2voto

user3439894 Puntos 5883

El ejemplo AppleScript código que se muestra a continuación, se probó de tres maneras diferentes, ejecutado en script Editor , ejecutado como un sistema autónomo AppleScript aplicación y se ejecuta como un Automatizador Servicio/Acción Rápida en MacOS Mojave con Lengua y región ajustes en Preferencias del sistema ajustado a Inglés (EE.UU.) - Primaria y me ha funcionado sin problemas 1 .

  • 1 Asume la configuración necesaria y adecuada en <strong>Preferencias del sistema </strong>> <strong>Seguridad y privacidad </strong>> <strong>Privacidad </strong>se han fijado/abordado según las necesidades.

Ejemplo AppleScript código :

ignoring application responses
    tell application "System Events" to ¬
        click menu bar item 1 of ¬
            menu bar 2 of ¬
            application process "Enjoyable"
end ignoring

delay 0.1
do shell script "killall 'System Events'"
delay 0.2

tell application "System Events"
    launch
    click menu item 1 of ¬
        menu 1 of ¬
        menu bar item 1 of ¬
        menu bar 2 of ¬
        application process "Enjoyable"
end tell

Notas:

Utilizando Inspector de accesibilidad , una parte de Xcode revela que no hay acción asignado a menu bar item 1 of menu bar 2 of application process "Enjoyable" y es probablemente por lo que se cuelga con el original código cómo lo has probado.

Para evitar el retraso de 5 ~ 6 segundos utilizando ignoring application responses Envolví la primera tell application "System Events" comando con una sola tarea que realizar, lo que permitió a los script para proceder, y luego matar el Eventos del sistema proceso de solicitud permite la segunda tell application "System Events" comando para realizar sus tareas con el mínimo retraso de ~1 segundo combinado para el funcionamiento de todo el script . Por supuesto, esto es mucho mejor que el retraso de 5 ~ 6 segundos sin hacerlo de esta manera.

El muy pequeño delay comandos antes y después del do shell script "killall 'System Events'" comando son para dar tiempo a la elemento de la barra de menús para mostrar su menú y para Eventos del sistema para terminar antes de llamarlo de nuevo para pulsar el objetivo elemento del menú . El valor de la delay comando puede necesitar un ligero ajuste y, si es así, hágalo como sea necesario.

Como se mencionó anteriormente, esto funcionó para mí sin problemas 1 Sin embargo, si por alguna razón el ejemplo AppleScript código que se muestra arriba, no funciona para usted, entonces aquí hay una forma programática de hacer clic en el objetivo elemento de la barra de menús en el barra de menús utilizando el cliclick o MouseTools utilidad de terceros .

  • Tengo cliclick y MouseTools situado en /usr/local/bin/ Así que cámbialo en el código si los tiene ubicados en otro lugar.

Usando: clicks

Ejemplo AppleScript código :

tell application "System Events" to ¬
    set thePositionSizeList to ¬
        the {position, size} of ¬
            menu bar item 1 of ¬
            menu bar 2 of ¬
            application process "Enjoyable"

set xPos to ¬
    (item 1 of item 1 of thePositionSizeList) + ¬
    (item 1 of item 2 of thePositionSizeList) / 2 ¬
    as integer

set yPos to ¬
    (item 2 of item 1 of thePositionSizeList) + ¬
    (item 2 of item 2 of thePositionSizeList) / 2 ¬
    as integer

set shellCMD to {¬
    "/usr/local/bin/cliclick -r c:", ¬
    xPos, ",", yPos, " w:50 c:", ¬
    xPos, ",", (yPos + 22)} as string

do shell script shellCMD

Notas:

Con cliclick se pueden encadenar múltiples eventos juntos y por qué el código termina en el do shell script shellCMD comando ya que hace clic tanto en el elemento de la barra de menús y el elemento del menú especialmente porque es la primera elemento del menú que es el objetivo.

cliclick está disponible como ejecutable binario precompilado , fuente código y también se puede instalar con Homebrew .

El actual ejecutable binario precompilado liberación de cliclick (5.0) no funcionará en MacOS Mojave y utilicé una versión más antigua que ya tenía (versión 4.0.1, publicada el 2018-04-10). Si no puedes adquirir una versión anterior puedes utilizar MouseTools en su lugar.


Utilizando: MouseTools

Ejemplo AppleScript código :

tell application "System Events" to ¬
    set thePositionSizeList to ¬
        the {position, size} of ¬
            menu bar item 1 of ¬
            menu bar 2 of ¬
            application process "Enjoyable"

set xPos to ¬
    (item 1 of item 1 of thePositionSizeList) + ¬
    (item 1 of item 2 of thePositionSizeList) / 2 ¬
    as integer

set yPos to ¬
    (item 2 of item 1 of thePositionSizeList) + ¬
    (item 2 of item 2 of thePositionSizeList) / 2 ¬
    as integer

set shellCMD to {¬
    "/usr/local/bin/MouseTools -x ", ¬
    xPos, " -y ", yPos, " -leftClick"} as string

do shell script shellCMD

delay 0.2

tell application "System Events" to ¬
    click menu item 1 of ¬
        menu 1 of ¬
        menu bar item 1 of ¬
        menu bar 2 of ¬
        application process "Enjoyable"

Notas:

Con MouseTools sólo se puede realizar una evento a la vez y por qué después de hacer clic en el elemento de la barra de menús en el barra de menús Acabo de volver a usar Eventos del sistema para hacer clic en el objetivo elemento del menú , frente a la llamada MouseTools una segunda vez, ya sea dentro de la primera do shell script comando o una segunda do shell script comando posiblemente tras un breve retraso.

Por ejemplo, podría cambiar el shellCMD a:

set shellCMD to {¬
    "/usr/local/bin/MouseTools -x ", ¬
    xPos, " -y ", yPos, " -leftClick;", ¬
    "/usr/local/bin/MouseTools -x ", ¬
    xPos, " -y ", (yPos + 22), " -leftClick"} as string 

A continuación, elimine todo lo que hay después del do shell script comando .

MouseTools está disponible como ejecutable binario precompilado y la fuente código .


Nota: El <em>ejemplo </em><strong>AppleScript </strong><em>código </em>es sólo eso y sin ningún tipo de inclusión <em>tratamiento de errores </em>no contiene ningún otro <em>tratamiento de errores </em>según corresponda. Corresponde al usuario añadir cualquier <em>tratamiento de errores </em>como sea apropiado, necesario o deseado. Eche un vistazo a la <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129232" rel="nofollow noreferrer"><strong>intente </strong></a><em>declaración </em>y <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_control_statements.html#//apple_ref/doc/uid/TP40000983-CH6g-129657" rel="nofollow noreferrer"><strong>error </strong></a><em>declaración </em>en el <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/introduction/ASLR_intro.html" rel="nofollow noreferrer"><strong>Guía del lenguaje AppleScript </strong></a>. Véase también, <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_error_xmpls.html#//apple_ref/doc/uid/TP40000983-CH221-SW1" rel="nofollow noreferrer"><strong>Trabajar con errores </strong></a>. Además, el uso del <a href="https://developer.apple.com/library/archive/documentation/AppleScript/Conceptual/AppleScriptLangGuide/reference/ASLR_cmds.html#//apple_ref/doc/uid/TP40000983-CH216-SW10" rel="nofollow noreferrer"><strong>retraso </strong></a><em>comando </em>puede ser necesario entre eventos cuando sea apropiado, por ejemplo <code>delay 0.5</code> con el <em>valor </em>de la <em>retraso </em>ajustado apropiadamente.

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