Perché il mio servizio Automator funziona in Automator ma non quando viene chiamato dal sistema operativo?

4

Ho creato un servizio Automator che esegue un oggetto Applescript con il modulo Run Applescript . Questo è lo 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

Quando ho il servizio aperto in Automator e premi Workflow -> Run tutto funziona come dovrebbe. Tuttavia, quando apro il servizio dalla barra dei menu, ad esempio in Safari, passando a Safari -> Services -> script name non accade nulla. Nulla è scritto sulla console, quindi non riesco a capire perché il servizio non funziona. Come posso rintracciare l'errore e far funzionare il servizio al di fuori di Automator?

    
posta Saaru Lindestøkke 14.06.2013 - 19:37
fonte

2 risposte

2

Che cosa intendeva fare ^ F9? Questo ha funzionato per me quando l'ho avvolto in un servizio:

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

Potresti provare a eseguire il flusso di lavoro con automator -v :

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

Run AppleScript is finished

The Automator workflow has completed.

Ci sono diversi problemi nell'utilizzo dei servizi di Automator per assegnare scorciatoie agli script. Vedi questa domanda . Se esegui il servizio con un collegamento con chiavi di modifica, potrebbe non esserci abbastanza tempo per rilasciarlo prima dei comandi del codice tasto.

Potresti anche usare uno script come questo:

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
    
risposta data 15.06.2013 - 20:19
fonte
1

Utilizzo dello strumento giusto per il lavoro giusto

  1. Potresti provare ad aggiungere un segnale acustico al tuo AppleScript per sapere se viene chiamato.

  2. I servizi non sono stati eseguiti prima quando ci sono due cose che cercano di utilizzare le stesse combinazioni di chiavi. Puoi provare ad aggiungere più tasti modificatori per rendere meno probabile un conflitto (per test e debug.)

  3. Quando vedo il codice che dipende dal chiamare il comando chiamato "delay", ho la brutta sensazione che il codice non funzioni sempre.

  4. AppleScript era inteso da Apple come un'interfaccia utente alternativa, un'alternativa al mouse e alla tastiera che utilizza AppleEvents per eseguire la comunicazione delle applicazioni Interprocess (IAC). Credo che potresti voler utilizzare i servizi AppleScript e Automator per fornirti una GUI con cui lavorare, ma mi sembra probabile che dovresti usare qualcosa di livello inferiore rispetto a AppleScript e AppleEvents per quello che stai facendo.

Quindi, sto parlando di aggiungere una sorta di script di shell al mix per far funzionare tutto in modo affidabile.

--- Modifica ---

Dal momento che @markhunte ha criticato la mia risposta come se non fosse una risposta, cercherò di fare meglio.

  1. Ho suggerito di mettere alcune chiamate a "beep" nel tuo AppleScript per eseguire il debug se il tuo script è stato persino chiamato o meno. L'ho provato e non ha funzionato.

Ho trovato il seguente link che parla della creazione della propria funzione di registro. Penso che funzionerà meglio. link

Ecco la mia versione del codice per fare il tuo log usando AppleScript, da quanto ho capito, la funzione di registro che è incorporata in AppleScript mostra solo i risultati nella parte inferiore delle finestre dell'editor AppleScript, e penso che il registro di sistema è difficile da capire. Questa funzione di registro funziona per me, l'ho effettivamente provato:

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

Ho avvolto il codice in un

on run
end run

perché il codice sembrava funzionare meglio per me in quel modo.

Oltre alla registrazione, per eseguire il debug, potresti provare a utilizzare alcuni caratteri visibili come "A", "B" e "C" e potresti vedere se vengono digitati in Safari.

Un'altra idea per te. Quando ho provato per la prima volta lo script, la chiave F8 era legata a qualcosa. Dovevo andare in Preferenze di Sistema > Tastiera > Tasti di scelta rapida e scioglie la combinazione di tasti ^ F8 da ciò a cui era legata. (Questo è come quello che ho detto nella mia prima risposta che penso abbia avuto alcune buone idee come provare diverse combinazioni di tasti.)

Ecco un link a una schermata. È nella mia cartella Dropbox pubblica. Fammi sapere se riesci a vederlo mentre sto provando a condividere i link utilizzando Dropbox.

link

Che cosa stai cercando di fare? Blocca una tastiera con questa sequenza di combinazioni di tasti?

Il flusso di lavoro è stato eseguito per me in Safari (dopo aver modificato il tasto F8 di controllo nelle scorciatoie da tastiera in Preferenze di sistema) e in Safari, ho ricevuto una chiave di sottoscheda, ma la tastiera non si blocca. Questo richiede un ulteriore software per farlo funzionare?

[email protected]

--- Modifica ---

Ho aggiunto la pagina man per il comando "automator" al mio sito Web che è ancora agli inizi.

pagina man per il comando di automazione link

--- Modifica ---

Ho qualche idea in più per te:

  1. Nelle Preferenze di Sistema, ci sono alcune preferenze per abilitare le funzionalità che ti aiutano (almeno durante il debug).

A. Vi sono "chiavi adesive" che consentono a un tasto modificatore di restare e non andare via così velocemente, questo potrebbe aiutare. Non lo so.

link

B. È un'opzione che consente di visualizzare un'immagine sullo schermo (e riprodurre l'audio) quando viene rilevato un tasto modificatore.

link

  1. Potresti usare un programma creato appositamente per gestire la definizione di combinazioni di tasti. Anni fa, usavo un programma chiamato QuicKeys. Sembrano avere meno supporto per Mac ora, ma potresti usare google per "Alternative a QuicKeys" se questo dovesse funzionare per far sì che un altro programma gestisca la definizione degli equivalenti da tastiera.

PS: ho appena disattivato tutte queste preferenze dalle Preferenze di sistema di accessibilità, non posso sopportarne l'uso (forse alcune sarebbero OK ma penso che le "Sticky Keys" stessero causando il blocco delle maiuscole a scrivere tutto in tutte le maiuscole. :().

link

Potrebbe essere meglio usare Spark.app per gestire gli equivalenti della chiave di comando
link

    
risposta data 23.06.2013 - 02:35
fonte

Leggi altre domande sui tag