Come mantenere un'applicazione su tutte le finestre usando AppleScript?

3

Ho un file .app di AppleScript che consiste essenzialmente in una serie di finestre di dialogo.

Vorrei mantenere questa applicazione sopra tutte le altre finestre (inclusa la parte superiore di tutte le nuove finestre create mentre l'applicazione è ancora in esecuzione), finché AppleScript non è completo e l'applicazione si chiude automaticamente.

È possibile bloccare una finestra in primo piano con AppleScript?

    
posta rubik's sphere 29.01.2017 - 00:04
fonte

1 risposta

1

Metodo 1: SystemUIServer

Dopo ore di ricerche online e test di varie soluzioni, ho trovato un metodo per mantenere un AppleScript in esecuzione su tutte le finestre. Il metodo è fornito nel post n. 2 di questo thread MacScripter.net .

Ecco il codice:

tell application "SystemUIServer"
   activate
end tell

Ho inserito il mio intero codice AppleScript all'interno dell'istruzione tell sopra riportata. Questo ha funzionato perfettamente nella prima finestra di dialogo, ma, sfortunatamente, questo ha causato un errore poco dopo aver progredito attraverso l'AppleScript.

Quello che dovevo fare era incapsulare manualmente ogni finestra di dialogo nella propria istruzione tell . Per ogni istanza di:

choose from list
display alert
display dialog

Ho dovuto aggiungere una dichiarazione. Ho innumerevoli dialoghi incorporati nell'AppleScript in questione, quindi mi ci sono volute diverse ore per completare.

Quindi, questa non è una grande risposta, in quanto è potenzialmente molto laboriosa. Idealmente, si potrebbe inserire l'istruzione SystemUIServer una sola volta nel proprio codice ed essere fatto con esso.

Una nota sul timeout predefinito:

Se incapsuli una finestra di dialogo all'interno del suddetto blocco, per impostazione predefinita, lo script scadrà se l'utente non fa clic su un pulsante entro 2 minuti. Quando si verifica questo timeout, lo script verrà annullato. L'utente riceverà il seguente errore:

SystemUIServer got an error: AppleEvent timed out.

(Stranamente, tuttavia, anche dopo che l'utente chiude questa finestra di errore, la finestra di dialogo originale rimarrà bloccata in cima fino a quando l'utente non fa clic su un pulsante nella finestra di dialogo.)

Ecco la descrizione pertinente da Documentazione AppleScript per with timeout :

When a command fails to complete in the allotted time (whether the default of two minutes, or a time set by a with timeout statement), AppleScript stops running the script and returns the error "event timed out". AppleScript does not cancel the operation—it merely stops execution of the script. If you want the script to continue, you can wrap the statements in a try statement. However, whether your script can send a command to cancel an offending lengthy operation after a timeout is dependent on the application that is performing the command.

Quindi, se non vuoi che il timeout abbia effetto sulle tue finestre di dialogo, procedi come segue:

tell application "SystemUIServer"
    with timeout of 999999 seconds
       activate
        display dialog "Hello World"
    end timeout
end tell

Una nota sulle finestre di dialogo di input:

Il metodo 1 non funziona correttamente con un display dialog che ha un campo di testo (cioè, default answer "" ).

Mentre la finestra di dialogo è mantenuta in cima a tutte le altre finestre, se l'utente fa clic in un punto qualsiasi al di fuori dei limiti della finestra di dialogo, l'utente non sarà in grado di digitare del testo nella casella di testo. Il cursore del testo lampeggiante scomparirà definitivamente.

La barra superiore della finestra di dialogo diventa immediatamente bianca quando l'utente fa clic fuori dalla finestra di dialogo. Non è possibile ottenere la barra per tornare al colore grigio scuro (che riflette uno stato primo piano / attivo), in modo che il testo possa essere digitato.

L'utente sarà comunque in grado di premere qualsiasi pulsante nella finestra di dialogo, ma la funzione principale della finestra di dialogo, ad esempio, per ottenere un input di testo dall'utente, verrà seriamente ostacolata.

In breve, non è consigliabile includere le finestre di dialogo di input in un blocco SystemUIServer tell.

Metodo 2: app FastScripts

Un altro modo per mantenere ogni finestra di un file AppleScript appuntato su tutte le altre finestre consiste nell'utilizzare un'applicazione di terze parti intitolata FastScripts per attivare i file di script. FastScripts mantiene tutte le finestre di dialogo bloccate in primo piano per impostazione predefinita, il che è molto utile. Non so nemmeno se questa funzione può essere disabilitata (se si volesse disattivarla, io no).

I FastScripts possono avviare un file .scpt tramite una scorciatoia da tastiera personalizzata o manualmente (è sufficiente fare clic sull'icona FastScripts nella barra dei menu per visualizzare un elenco a discesa degli script).

(So che quando ho fatto questa domanda in origine, ho specificato che AppleScript è stato salvato come file .app, ma un file .app di AppleScript può essere convertito in un file .scpt di AppleScript facilmente e in poco tempo.)

Naturalmente, questo metodo è interessante perché non è necessario modificare un bit del loro codice AppleScript per l'effetto desiderato da implementare. FastScripts fa tutto il duro lavoro.

    
risposta data 29.01.2017 - 10:35
fonte

Leggi altre domande sui tag