C'è un modo per ottenere un elenco di tutti i titoli delle finestre del programma attualmente in esecuzione con AppleScript?

0

Sto cercando di scrivere uno script che restituisca un elenco di tutti i titoli delle finestre di tutti i programmi attualmente in esecuzione. C'è un modo per farlo con AppleScript? Ho provato a eseguire il seguente codice:

tell application "System Events"
    repeat with theProcess in (every process)
        if background only of theProcess is false then
            say (name of theProcess) as string
        end if
    end repeat
end tell

L'ho messo in un file chiamato lawl.scpt e poi ho eseguito quanto segue nel Terminale:

$ osascirpt lawl.scpt

Tuttavia, si ferma solo per alcuni secondi, quindi esce senza emettere alcun risultato.

    
posta Claudiu 26.02.2015 - 06:19
fonte

1 risposta

1

I'm looking to write a script which outputs a list of all the window titles of all the currently running programs.

Il semplice metodo one-liner per ottenere questo risultato in AppleScript è:

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

In modo fastidioso, questo restituisce un elenco annidato, che dovrai scorrere in un blocco repeat with , o appiattire il nido in un elenco semplice (che non è troppo difficile).

L'esecuzione di AppleScript dalla riga di comando ha il vantaggio che i dati restituiti sono in formato testo, che può essere manipolato abbastanza facilmente. Puoi anche utilizzare la riga di comando da AppleScript per ottenere i vantaggi di ciascuna:

    do shell script "osascript -e \" ¬
        set text item delimiters to tab
        tell app \\"system events\\" to get name of every window of ¬
            (every process whose background only is false)
        return the result as text \" | egrep -oi -e '[^\t]+'"

    return paragraphs of result

che restituisce un elenco di titoli di finestre piacevole e diretto.

Infine, ecco un AppleScript formale per eseguire correttamente il lavoro, in modo che tu possa mantenere la possibilità di fare riferimento all'oggetto della finestra se hai bisogno di ottenere altre proprietà o manipolarlo:

    use application "System Events"

    property R : {WindowTitle:missing value, AttachedToProcess:missing value}

    set WindowList to {}

    set P to a reference to (every process whose background only is false)

    repeat with proc in P
        set [proc] to proc
        set W to (a reference to every window of proc)

        repeat with _w in W
            set [_w] to _w

            copy R to end of WindowList
            tell last item of WindowList
                set its WindowTitle to title of _w
                set its AttachedToProcess to name of proc
            end tell
        end repeat
    end repeat

    return WindowList

L'elenco risultante è un elenco di record che hanno la struttura di property R . Ogni record rappresenta una singola finestra, che contiene il titolo della finestra e il nome del processo a cui appartiene, ad es. %codice%. In questo modo, è facile fare cose con la finestra, come ad esempio:

    set TheWindow to item 2 of WindowList --> {WindowTitle:"...", AttachedToProcess:"..."}

    tell process named (TheWindow's ProcName) to ¬
        tell window named (TheWindow's WindowTitle) to ¬
            set [focused, position, size] to [true, {0, 0}, {400, 777}]
    
risposta data 29.01.2018 - 02:31
fonte

Leggi altre domande sui tag