Posso usare AppleScript per rilevare se ci sono finestre sullo schermo?

1

Ho uno script bash che richiede di sapere se ci sono finestre nella schermata corrente. Non potevo farlo in bash quindi forse c'è un modo. Inoltre, se trovassi una finestra attiva (se ci sono finestre sullo schermo) sarebbe bello ma non è così importante. Grazie

    
posta user2420562 22.02.2018 - 16:29
fonte

1 risposta

3

Questo è uno di quei compiti che, in superficie, è abbastanza semplice da fare, ma quando si sperimenta un po 'di più, i risultati possono essere un po' complicati, poiché non tutte le applicazioni o le finestre delle applicazioni riportano le loro proprietà o attribuisce completamente sinceramente tutto il tempo.

Questa linea di AppleScript è il modo più convenzionale e comunemente usato per ottenere un elenco di finestre aperte dalle applicazioni in esecuzione sul tuo sistema:

    tell application "System Events" to ¬
        get every window of every process whose background only is false

Questo ti darà un elenco di anche quelle finestre che sono attualmente ridotte a icona e poste sotto l'icona del dock. Puoi ottenere un elenco di sole finestre non ridotte al minimo e quindi visibili sullo schermo in quel momento:

    tell application "System Events" to ¬
        get every window of (every process whose visible is true)

Tuttavia, questo a volte mancherà a rilevare alcune finestre di applicazioni in background (alcune app della barra dei menu) che non vengono segnalate come visibili anche quando le loro finestre sono aperte. Quindi, per catturarli, puoi usare questo:

    tell application "System Events" to get windows of ¬
        (every process whose class of windows contains window) ¬
            whose value of attribute "AXMinimized" is false

Questo ha il vantaggio di restituire solo i nidi non vuoti degli elenchi in AppleScript, è il mio metodo preferito da usare come uno che cattura solo lo sfondo, finestre "invisibili".

Per chiamare questi comandi da bash, puoi usare questo:

    osascript \
        -e 'tell application "System Events"' \
        -e '    get every window of (every process ¬' \
        -e '        whose background only is false  ¬' \
        -e '        and visible is true)' \
        -e 'end tell'

Questa è la combinazione dei primi due esempi che ho dato, che restituisce un elenco delimitato da virgole di finestre denotate dai loro titoli, come questo:

,,, window Edit - Ask Different of application process Safari,, \
    window ~ — osascript  /Users/CK — ttys000 — ⌘1 of application process Terminal,, \
    window Untitled 2 of application process Script Editor, \
    window Messages of application process Script Editor, \
    window Library of application process Script Editor

(Ho diviso l'output su più righe per renderlo leggibile.) Notate le tre virgole principali, che, in AppleScript, sono dove otterreste gli elenchi di nidificazione vuoti che appaiono come risultato di processi visibili e in primo piano , ma semplicemente non hanno finestre aperte, quindi restituisci {} in AppleScript, che diventa una stringa vuota "" in stdout .

Come puoi vedere, ho questa finestra Safari aperta; una finestra Terminale aperta; e tre finestre Script Editor aperte. Tuttavia , ha mancato la mia finestra del feed Instagram . Ecco l'altro esempio eseguito in bash:

    osascript \
        -e 'tell application "System Events" to ¬' \
        -e '    get every window of (every process ¬' \
        -e '        whose class of windows contains window) ¬' \
        -e '    whose value of attribute "AXMinimized" is false'

che restituisce questo per me adesso:

    window Edit - Ask Different of application process Safari, \
    window ~ — osascript  /Users/CK — ttys000 — ⌘1 of application process Terminal, \ 
    window Untitled 2 of application process Script Editor, \
    window Messages of application process Script Editor, window Library of application process Script Editor, \
    window Main Window of application process Flume

( Flume è la mia app di Instagram.) Tuttavia, il costo dell'utilizzo di questo metodo richiede un po 'più di tempo di elaborazione (un paio di secondi).

Infine, se tutto ciò che ti serve è solo il numero effettivo di finestre aperte sullo schermo per determinare se questo è diverso da zero o altro, basta scambiare get every window... con get the number of (windows...) in qualsiasi metodo tu scelga di usare .

Nota: alcuni di questi comandi potrebbero funzionare diversamente su sistemi meno recenti. Li ho testati su Mac OS 10.13 usando AppleScript 2.7. Tuttavia, molto raramente, Eventi di sistema possono generare un errore. Si prega di eseguire di nuovo il comando. Questo non è un problema con lo script, ma un problema con Eventi di sistema e il suo comportamento di carattere occasionale.

    
risposta data 23.02.2018 - 03:22
fonte

Leggi altre domande sui tag