Come rendere lo script sfocato in AppleScript?

4

Dispongo di un servizio di automazione composto da una singola azione "Esegui AppleScript" . L'AppleScript consiste fondamentalmente in una serie di finestre di dialogo.

Nel mezzo dello script, lo script si basa sulla sequenza di tasti ⌘ comando + C per ottenere il rich text selezionato nello script come the clipboard . Questo comando di copia deve trovarsi nel mezzo dello script, poiché l'utente potrebbe voler incollare gli appunti reali nella finestra di dialogo iniziale.

Le finestre di dialogo di AppleScript in Servizi sono di default bloccate in cima a tutte le finestre; non puoi cambiarlo.

AppleScript è in grado di battere il tasto ⌘ comando + C solo quando l'app sottostante è a fuoco, il che ha senso, considerando che è l'app sottostante - non il finestra di dialogo script - che contiene il testo selezionato.

Quindi, inserirò la mia domanda in modo inelegante: c'è un modo per rendere la parte superiore della finestra immediatamente dietro la finestra di dialogo Servizio grigio e quindi rendere bianca la barra superiore della finestra di dialogo Servizio, senza tuttavia spostare la finestra di dialogo dello script fuori dalla vista?

Non posso passare dal titolo della finestra o dell'app della finestra, perché queste variabili possono variare. La costante è che la finestra che voglio mettere a fuoco sarà sempre immediatamente dietro la finestra di dialogo del servizio.

Quello che segue è un esempio di ciò di cui sto parlando:

-- Back up original clipboard contents:
set savedClipboard to the clipboard

set optionList to {"Uppercase case"}
set dialogBoxChoice to choose from list optionList with title "Change case of selection" with prompt "Choose a letter case:"

-- Copy selected text to clipboard:
tell application "System Events" to keystroke "c" using {command down}
delay 1 -- Without this, the clipboard may have stale data.
set theSelectedText to the clipboard

-- Makes the selected text all uppercase:
-- From: http://apple.stackexchange.com/a/171196/184907
set theModifiedSelectedText to (do shell script ("echo " & theSelectedText & " | tr a-z A-Z;"))

display dialog theModifiedSelectedText

-- Overwrite the old selection with the desired text:
set the clipboard to theModifiedSelectedText
tell application "System Events" to keystroke "v" using {command down}
delay 1 -- Without this delay, may restore clipboard before pasting.

-- Restore clipboard:
set the clipboard to savedClipboard

Se inserisci il codice sopra in un servizio attivato da scorciatoie da tastiera, vedrai che lo script non riuscirà a tell application "System Events" to keystroke "c" using {command down} ; quindi, theSelectedText sarà identico a savedClipboard ogni volta.

    
posta rubik's sphere 14.02.2017 - 06:55
fonte

1 risposta

2

Questo farà ciò che penso tu stia cercando. Ho rimosso la "scelta di uno" dall'inizio in quanto non sembrava rilevante per il flusso di lavoro.

Sto utilizzando una variabile activeApp per chiamare l'applicazione in avanti dopo le finestre di dialogo. Se usi Eventi di sistema per chiamare in avanti, non ripristinerà la finestra in primo piano.

Usando tell me invece di tell application "System Events" eccetto dove necessario, puoi evitare la complicazione della finestra di dialogo modale rubando focus & non tornare alla finestra in primo piano in seguito.

L'aggiunta di & quoted form of allo shellscript funzionerà in più casi. Alcune app non funzioneranno correttamente, incluso Automator stesso.

Il servizio Automator riceve no input da any application
Ho lasciato un sacco di debug, sotto forma di finestre di dialogo, per osservare i progressi.

on run {input, parameters}
    tell me
        tell application "System Events" to set activeApp to name of first application process whose frontmost is true
        -- Back up original clipboard contents:
        set savedClipboard to the clipboard
        display dialog ("Original clip - " & (the clipboard))
        activate application activeApp
        tell application "System Events" to keystroke "c" using command down
        delay 1
        display dialog ("Copied clip - " & (the clipboard))
        set theSelectedText to the clipboard
        set theModifiedSelectedText to do shell script "echo " & quoted form of theSelectedText & " | tr a-z A-Z;"
        display dialog {"Modified clip - " & theModifiedSelectedText}
        activate application activeApp
        set the clipboard to theModifiedSelectedText
        delay 1
        tell application "System Events" to keystroke "v" using {command down}
        -- Restore clipboard:
        delay 1
        set the clipboard to savedClipboard
        display dialog ("Restored clip - " & (the clipboard))
    end tell
    set input to {}
    return input
end run
    
risposta data 14.02.2017 - 12:24
fonte

Leggi altre domande sui tag