Comment enregistrer et rejouer l'activité de la souris sur l'automate en arrière-plan?


3

Je souhaite créer une "application" dans Automator pour enregistrer les actions de la souris. Lorsqu’elle est exécutée, je veux qu’elle exécute les actions en arrière-plan, comme cela se produit lorsqu’une macro est exécutée dans Excel, plutôt que de la rejouer simplement comme un film. Est-ce possible?


Qu'est-ce que vous essayez réellement de faire?
user3439894

essayer d'ouvrir les préférences d'un élément de la barre de menus pour effacer les entrées qu'il contient.
Rathan

Quel élément de la barre de menu?
user3439894

Copyclip 2> Préférences> avancées> effacer tous les clips
Rathan

S'il vous plaît voir la note de mise à jour: à ma réponse.
user3439894

Réponses:


2

Note de mise à jour:

Ma réponse originale, présentée ci-dessous, a été écrite à l'aide d'un exemple générique et non de la cible réelle, car elle n'avait pas encore été divulguée. Une fois qu'il a été divulgué, dans un commentaire, je l' ai téléchargé COPIERPRESS 2 et écrit le AppleScript du code en utilisant l' interface utilisateur de script pour afficher le Préférences avancées volet , cliquez sur le Supprimer tous les clips bouton , la suite Supprimer tout bouton , fermer la Préférences fenêtre et fermer la Interface utilisateur qui montre les clips. Cela fonctionne, mais c'est des scripts d'interface utilisateuret vous le voyez comme si vous l'aviez fait manuellement, mais cela se produit beaucoup plus rapidement et sans voir les mouvements visuels de la souris sur l'écran. (Pas vraiment une solution d' arrière - plan .)

Cela dit, j'ai trouvé que CopyClip 2 était très instable et que je courais le script à une ou deux reprises , ce qui explique pourquoi je ne publie pas le code, sauf si vous voulez vraiment le voir. Donc, je ne recommande pas la méthode de script d'interface utilisateur . Notez que l'instabilité exprimée était simplement liée à l'utilisation d' AppleScript sur l'application et non à son utilisation globale. (En fait, je ne l'ai pas utilisé autrement que pour répondre à la question.)

En recherchant à présent une solution d’ arrière - plan , j’ai cherché à savoir comment CopyClip 2 stockait les clips et trouvé où se trouvait le magasin de données des clips et sous quelle forme. Sans surprise, il est stocké dans une base de données SQLite . Donc, avec cette information, je vois deux options différentes:

La première consiste à manipuler les données stockées dans la base de données SQLite . Le problème, c'est que je ne fais pas de programmation SQL , vous devrez donc choisir cette option par vous-même.

La deuxième option est davantage une méthode de quasi-force brute, mais elle fonctionne bien et ne bloque pas l'application dans le processus. Cela implique de quitter CopyClip 2 par programme , de supprimer la base de données de clips et de redémarrer CopyClip 2 .

L'une ou l'autre de ces options serait considérée comme la méthode d'arrière - plan , en particulier par rapport à l' utilisation de scripts d'interface utilisateur .

L' exemple de code de script BASH suivant est celui que j'ai utilisé pour la deuxième option mentionnée. Il peut être exécuté de différentes manières.

#!/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

J'ai d'abord testé cette demi-douzaine de fois dans Terminal en tant que script BASH exécutable avant d'utiliser le code dans une action Exécuter un script shell dans une application Automator , puis une demi-douzaine de fois. Pour mes 2 centimes, c'est la façon dont j'essaierais d'essayer de faire l' option de programmation SQL même si je connaissais SQL .

Enregistré en tant qu'application Automator , par exemple, Supprimer tous les clips en ClipClip , j'ai utilisé Spotlight pour le rechercher et l'exécuter, c'est-à-dire:

CommandSpacedelEnter

L' application peut également être placée dans le Dock pour un clic rapide de la souris afin de supprimer également tous les clips.

Soit dit en passant, la fenêtre de masquage au démarrage est également définie sur Activé dans l' onglet Général de Préférences pour CopyClip 2 , afin de le rendre aussi apparent que possible en arrière-plan . Ainsi, à moins que vous ne regardiez directement l' icône de la barre de menus pour CopyClip 2 , vous ne remarquerez pas vraiment qu'elle a été fermée et rouverte.

Notez également que la base de données de clips est normalement créée lors de la première exécution et que seules les modifications apportées aux clips sont stockées ou supprimées via CopyClip 2 . J'ai examiné la base de données de clips à l'aide de SQLiteBrowser lors de la création initiale et après la suppression de tous les clips. Sa structure n'est en principe pas différente de celle de la création 1 ; la suppression répétée de la base de données de clips n'est donc pas un problème pour atteindre l'objectif.
( 1 Bien qu'il y ait des différences techniques, les données supprimées n'avaient pas encore été supprimées de la base de données par la commande VACUUM. Néanmoins, cette option est extrêmement sûre et ne devrait pas être problématique en cas d'utilisation répétée.)



Réponse originale:

À l'aide du bouton Enregistrer dans Automator , vous avez enregistré quelques clics de souris dans la barre de menus , ce qui a généré une action Watch Me Do dans le flux de travail . Par la suite, en exécutant le flux de travail Automator contenant l’ action Watch Me Do , votre texte se lit comme un film.

Vous demandez donc si cela peut fonctionner en arrière-plan plus comme une macro Excel que de jouer comme un film?

De manière générale, la réponse courte est à la fois oui et non ... oui plutôt comme une macro (en quelque sorte), mais non pas en arrière-plan.

Cela dit, notez cependant et selon l'application cible et ce qui doit être fait, il peut y avoir une possibilité de coder quelque chose à exécuter en arrière-plan, mais sans connaître les détails explicites, cela dépasse le cadre de cette réponse généralement courte.

La réponse plus longue consiste à convertir l' action Watch Me Do en un code AppleScript approprié . Toutefois, comme il utilise les scripts d'interface utilisateur, il ne peut pas s'exécuter en arrière-plan, mais il peut s'exécuter beaucoup plus efficacement et plus rapidement qu'une action Watch Me Do et que vous ne voyez pas les mouvements visuels de la souris sur l'écran. Cela signifie que lorsque le code AppleScript est exécuté, quel que soit le moyen choisi, il faut autoriser le script à traiter son code de manière ininterrompue, ce qui constitue l'un des inconvénients du script d'interface utilisateur .

Cependant, je pense que vous trouverez cela plus souhaitable que de jouer comme un film et de voir la souris bouger visuellement à travers l'écran.

À titre d'exemple, l' enregistrement de mes actions en utilisant l' horloge sur la barre de menus dans cet exemple, je vais cliquer sur l' horloge élément de menu , puis cliquez sur les Préférences Open Date et heure ... élément de menu , puis cliquez sur le Fermer bouton sur la date Préférences et heure volet des Préférences système , qui est ouvert à la suite des deux précédents clics .

Dans Automator , je sélectionne les trois événements dans l' action Watch Me Do , puis appuyez sur pour copier les événements dans le Presse-papiers.CommandC

J'ouvre maintenant l' éditeur de script et, dans un nouveau document , appuyez sur CommandV pour coller les événements copiés dans le presse-papiers.

Cela produit le code AppleScript indiqué à la toute fin de cette réponse, qui y est placée car elle ne sera pas utilisée en grande partie, mais elle comportera les éléments clés du code , ce qui évite de devoir saisir manuellement tout le code fini. n’est inclus ici que pour l’exhaustivité de cet exemple.

Dans le code collé , trois commandes représentent les événements de clic réels. Comme il utilise des scripts d'interface utilisateur, il est exécuté par les événements système .

Ainsi, dans un autre nouveau document , dans l' éditeur de script , j'ajoute un tell application "System Events" bloc , par exemple:

tell application "System Events"

end tell

Dans ce bloc tell , j'ai copié la partie appropriée des trois événements de clic du code collé dans l'autre document tout en supprimant le code inutile et les barres obliques inverses pour ce cas d'utilisation, par exemple:

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

Comme il s'agit d'un script d'interface utilisateur , il faut maintenant ajouter les delay commandes appropriées , par exemple:

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

Maintenant, alors que je pourrais exécuter le code ci-dessus (ou même le code initialement collé ) et qu'il devrait fonctionner correctement à ce stade, le problème est que menu bar item 7, qui est actuellement l' horloge sur mon système, peut changer. De même, dans certains cas, le menu item nchangement peut aussi bien, mais pas dans cet exemple d'utilisation. Cependant, sachant cela, réécrivons le code afin qu'il ne soit pas codé en dur pour le numéro d'élément de la barre de menu ou le numéro d'élément de menu :

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

Dans le code ci-dessus, les trois lignes de code d'origine ont été commentées, c'est-à-dire qu'elles ont --été ajoutées devant chaque ligne. En outre, la troisième ligne d'origine contient une ligne supplémentaire commentée, mais elle a été ajoutée pour montrer comment généraliser la troisième ligne d'origine. Cependant, puisque cet exemple avait pour but de fermer les Préférences Système , indiquez-lui simplement de quitter .

Ainsi , la version finale du exemple de code pour gérer les trois événements qui ont eu lieu dans l'exemple Watch Me Do l' action en Automator est:

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

En comparant maintenant cet exemple final du code ci-dessus au code original présenté ci-dessous, on peut voir la différence et ce qui est nécessaire pour nettoyer le code original sans coder en dur le numéro d'élément de la barre de menu ou le numéro d'élément de menu , le rendant ainsi plus intelligent. puis en utilisant l' action Watch Me Do dans Automator .


Remarque: L’ exemple de code AppleScript ci-dessus n’est que cela et, sans l’emballer dans une instruction , n’inclut aucune autre gestion des erreurs pouvant être appropriée / nécessaire / souhaitée, il incombe à l’utilisateur d’ajouter toute gestion d’erreur appropriée pour chaque exemple. code présenté et ou code écrit par soi-même. Cela inclut la définition de la valeur des commandes en fonction du temps sur leur propre système.try delay

En outre, tous les éléments de menu ne sont pas aussi faciles à écrire que dans cet exemple et, dans certains cas, ne fonctionneraient pas correctement même avec cette méthode. Cela dépend. C'est l'une des raisons pour lesquelles j'ai essayé d'obtenir des informations plus explicites et spécifiques de votre part. mes commentaires. Autrement dit, j’aurais peut-être pu vous fournir un code explicite et spécifique répondant à vos besoins immédiats, au lieu d’avoir à écrire une réponse à l’aide d’un exemple. Espérons que cet exemple sera utile à d’autres aussi.


Le code AppleScript original généré lorsque les événements ont été copiés et collés à partir de l' action Watch Me Do dans Automator pour cet exemple d'utilisation:

-- 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.