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}]