3 votos

¿Cómo grabar y reproducir la actividad del ratón en Automator en segundo plano?

Quiero crear una "aplicación" en Automator para registrar las acciones del ratón. Cuando se ejecute, quiero que ejecute las acciones en segundo plano, como ocurre cuando se ejecuta una macro en Excel, en lugar de simplemente reproducirla como una película. ¿Es esto posible?

0 votos

¿Qué es lo que realmente intentas hacer?

0 votos

Intentando abrir las preferencias de un elemento de la barra de menús para borrar las entradas en él.

0 votos

¿Qué elemento de la barra de menús?

2voto

user3439894 Puntos 5883

Nota de actualización:

Mi respuesta original, que se muestra más abajo, fue escrita utilizando un ejemplo genérico y no el objetivo real porque aún no se había revelado. Una vez revelado, en un comentario, descargué CopyClip 2 y escribió el AppleScript código utilizando Guiones de interfaz de usuario para que aparezca el Preferencias avanzadas panel , haga clic en el Borrar todos los clips botón La siguiente Borrar todo botón , cerrar el Preferencias ventana, y cerrar el UI que muestra los clips. Funciona, sin embargo es Guiones de interfaz de usuario y lo ves como si lo hicieras manualmente, pero ocurre mucho más rápido y sin ver los movimientos visuales del ratón por la pantalla. (No es realmente un fondo solución).

Dicho esto, sin embargo, he encontrado CopyClip 2 para ser muy inestable y se estrelló cada dos o tres veces que corrió el script y por qué no voy a publicar el código a menos que realmente quieras verlo. Así que no recomiendo el Guiones de interfaz de usuario método. Tenga en cuenta que la inestabilidad expresada fue sólo en conjunto con el uso de AppleScript en la aplicación y no en el uso general de la misma. (En realidad no la he utilizado más que para responder a la pregunta).

Buscando ahora un fondo solución Investigué cómo CopyClip 2 almacena los clips, y encontró dónde estaba el almacén de datos de clips y en qué forma. Como es lógico, se almacena en un SQLite base de datos. Así que con esa información, veo dos opciones diferentes:

La primera consiste en manipular los datos almacenados en el SQLite base de datos. El problema es que no hago SQL programación, por lo que tendrías que buscar esa opción por tu cuenta.

La segunda opción es más bien un método casi de fuerza bruta, pero funciona bien y no se bloquea la aplicación en el proceso. Se trata de salir programáticamente de CopyClip 2 borrar la base de datos de clips y reiniciar CopyClip 2 .

Cualquiera de estas opciones se consideraría la método de fondo especialmente si se compara con el uso de Guiones de interfaz de usuario .

Lo siguiente ejemplo BASH scriptcódigo es lo que he utilizado para la segunda opción mencionada. Se puede ejecutar de diferentes maneras.

#!/bin/bash

if [ -n "$(pgrep "CopyClip 2")" ]; then
    pkill "CopyClip 2"
    sleep 1.5
    for i in $HOME/Library/Containers/com.fiplab.copyclip2/Data/Library/Application\ Support/CopyClip/*; do
        rm "$i" 2>/dev/null
    done
    open -a "CopyClip 2"
fi

Primero probé esto una media docena de veces en Terminal como un ejecutable BASH script antes de utilizar el código en un Ejecutar Shell script acción en un Automatizador aplicación y probado otra media docena de veces o más. Para mis 2 centavos de valor, esta es la forma en que iría sobre tratando de hacer el SQL opción de programación aunque supiera SQL .

Guardado como un Automatizador aplicación Por ejemplo, Borrar todos los clips de CopyClip , utilicé Spotlight para encontrarlo y ejecutarlo, es decir

CommandSpacedelEnter

El aplicación también podría colocarse en el Muelle para un clic rápido del ratón para borrar también todos los clips.

Por cierto, también tengo Ocultar la ventana como inicio ajustado a EN en el General ficha en Preferencias para CopyClip 2 para hacer esto como fondo como sea posible en apariencia. De esta manera, a menos que esté mirando directamente a la Barra de menús icono para CopyClip 2 No te das cuenta de que ha sido cerrado y reabierto.

Además, tenga en cuenta que la base de datos de clips se crea normalmente en la primera ejecución y sólo cambia a medida que los clips se almacenan o se eliminan a través de CopyClip 2 . He examinado la base de datos de clips utilizando SQLiteBrowser cuando se creó por primera vez y después de borrar todos los clips y su estructura no es esencialmente diferente que cuando se creó por primera vez 1 Así que borrar repetidamente la base de datos de clips no es un problema para lograr el objetivo.
<em>( <sup>1 </sup>Aunque técnicamente hay algunas diferencias, los datos borrados aún no han sido eliminados de la base de datos por el comando VACUUM, sin embargo esta opción es extremadamente segura y no debería ser problemática con el uso repetido).</em>


Respuesta original:

Utilizando el Registro botón en Automatizador , has grabado algunos clics del ratón en el Barra de menús y esto produjo un Verme hacer acción en el flujo de trabajo . Posteriormente, la ejecución de la Automatizador flujo de trabajo que contiene el Verme hacer acción Para usar tus palabras, es como una película.

Así que usted está preguntando si esto puede ejecutar en el fondo más como un Excel macro ¿entonces jugar como una película?

En general, la respuesta corta es tanto sí como no... sí, más como una macro (más o menos), pero no, no en el fondo.

Dicho esto, tenga en cuenta, sin embargo, y dependiendo de la aplicación de destino y lo que hay que hacer, puede haber la posibilidad de codificar algo para llevar a cabo en el fondo, pero sin saber los detalles explícitos que está más allá del alcance de esta respuesta corta en términos generales.

La respuesta más larga es, convertir el Verme hacer acción en la forma apropiada AppleScript código . Sin embargo, como utiliza Guiones de interfaz de usuario no puede funcionar en segundo plano, pero puede funcionar de forma mucho más eficiente y rápida que un Verme hacer acción se reproduce y no se ven los movimientos visuales del ratón en la pantalla. Esto significa que cuando el AppleScript código se ejecuta, por cualquier medio que se elija, hay que permitir que el script para procesar su código ininterrumpida, siendo así uno de los inconvenientes de Guiones de interfaz de usuario .

Sin embargo, creo que esto le resultará más deseable que jugar como una película y ver cómo el ratón se mueve visualmente por la pantalla.

Como ejemplo, la grabación de mis acciones mientras uso el Reloj en el Barra de menús en este ejemplo, voy a haga clic en el Reloj elemento del menú entonces haga clic en el Abrir las preferencias de fecha y hora elemento del menú entonces haga clic en el Cerrar botón en el Preferencias de fecha y hora panel de Preferencias del sistema que se abre como resultado de las dos anteriores clics .

En Automatizador Selecciono los tres Eventos en el Verme hacer acción , y a continuación pulse CommandC a copia el eventos al portapapeles.

Ahora Abrir Script Editor y en un nuevo documento , pulse CommandV a pegar el copiado eventos del portapapeles.

Esto produce el AppleScript código que se muestra al final de esta respuesta, que se coloca ahí porque no se utilizará mucho, pero tendrá las piezas clave de código Así que no hay que escribir manualmente todo el código terminado y sólo se incluye aquí para completar este caso de ejemplo.

Dentro de la pegada código hay tres comandos que representen el verdadero eventos de clicks y como esto es usar Guiones de interfaz de usuario se está haciendo por Eventos del sistema .

Así, en otro nuevo documento , en Script Editor , añado un tell application "System Events" bloque Por ejemplo:

tell application "System Events"

end tell

Dentro de ese bloque de cuentas He copiado la parte correspondiente de los tres eventos de clicks de la código pegado en el otro documento y eliminando lo innecesario código y barras invertidas para este caso de uso, por ejemplo

tell application "System Events"
    click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell

Ahora bien, como esto es Guiones de interfaz de usuario , apropiado delay comandos hay que añadir, por ejemplo:

tell application "System Events"
    click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    delay 0.5
    click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    delay 2.5
    click UI element 1 of window "Date & Time" of application process "System Preferences"
end tell

Ahora bien, aunque podría ejecutar el código arriba (o incluso el originalmente pegado código ) y debería funcionar correctamente en este momento, el problema es que menu bar item 7 que es actualmente el Reloj en mi sistema, puede cambiar. Así también, en algunos casos, puede menu item n también cambian, aunque no en este caso de uso del ejemplo. Sin embargo, sabiendo esto, vamos a reescribir el código por lo que no es codificado en forma permanente para el número de elemento de la barra de menús o el número de elemento del menú :

tell application "System Events"
    -- click menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
    delay 0.5
    -- click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process "SystemUIServer"
    click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
        of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
    delay 2.5
    -- click UI element 1 of window "Date & Time" of application process "System Preferences"
    -- click button 1 of window 1 of application process "System Preferences"
    quit application "System Preferences"
end tell

En el código arriba, las tres líneas originales de código han sido comentados, es decir -- delante de cada línea. Además, la tercera línea original tiene una línea adicional debajo comentada, pero se añadió para mostrar cómo generalizar la tercera línea original. Sin embargo, como su propósito en este ejemplo era cerrar Preferencias del sistema Sólo tienes que decirle a dejar de en su lugar.

Así que la versión final de ejemplo del código para manejar los tres eventos que tuvo lugar en el ejemplo Verme hacer acción en Automatizador es:

try
    tell application "System Events"
        click (every menu bar item of menu bar 1 of application process "SystemUIServer" whose description is "clock")
        delay 0.5
        click (every menu item of menu 1 of (every menu bar item whose description is "clock") ¬
            of menu bar 1 of application process "SystemUIServer" whose title is "Open Date & Time Preferences…")
        delay 2.5
        quit application "System Preferences"
    end tell
end try

Ahora, comparando esta versión de ejemplo final del código por encima del original código que se muestra a continuación, se puede ver la diferencia y lo que es necesario para limpiar el original código aunque no codificación dura el número de elemento de la barra de menús o el número de elemento del menú , por lo que es más inteligente que usar el Verme hacer acción en Automatizador .


Nota: El ejemplo AppleScript código de arriba es justo eso, y sin envolverlo en un try declaración no incluye ningún otro tratamiento de errores como sea apropiado/necesario/querido, el usuario tiene la responsabilidad de añadir cualquier tratamiento de errores para cualquier código de ejemplo presentado y o código escrito por el mismo. Esto incluye el establecimiento de la valor de la delay comandos según el tiempo en el propio sistema.

Además, no todos los elementos del menú son tan fáciles de guionizar como este caso de ejemplo y en algunos casos puede que ni siquiera funcione bien utilizar este método, simplemente depende y es una de las razones por las que intentaba obtener información más explícita y específica de ti en mis comentarios. Es decir, yo podría haber sido capaz de darle explícita y específica código para su necesidad inmediata, en lugar de tener que escribir una respuesta con un ejemplo. Aunque, con suerte, este ejemplo también puede ser útil para otros.


Original AppleScript código generado cuando eventos fueron copiados y pegados del Verme hacer acción en Automatizador para este ejemplo de uso:

-- Click the “clock” menu bar item.
delay 0.249747
set timeoutSeconds to 0.500000
set uiScript to "click menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )

-- Open Date & Time Preferences…
delay 0.186764
set timeoutSeconds to 0.500000
set uiScript to "click menu item 6 of menu 1 of menu bar item 7 of menu bar 1 of application process \"SystemUIServer\""
my doWithTimeout( uiScript, timeoutSeconds )

-- Click the “<fill in title>” button.
delay 0.509640
set timeoutSeconds to 0.500000
set uiScript to "click UI Element 1 of window \"Date & Time\" of application process \"System Preferences\""
my doWithTimeout( uiScript, timeoutSeconds )

on doWithTimeout(uiScript, timeoutSeconds)
    set endDate to (current date) + timeoutSeconds
    repeat
        try
            run script "tell application \"System Events\"
" & uiScript & "
end tell"
            exit repeat
        on error errorMessage
            if ((current date) > endDate) then
                error "Can not " & uiScript
            end if
        end try
    end repeat
end doWithTimeout

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