Estoy buscando escribir un script que emita una lista de todos los títulos de las ventanas de todos los programas actualmente en ejecución.
El método fácil y de una sola línea para lograr esto en AppleScript es:
tell application "System Events" to get the name of every window of ¬
(every process whose background only is false)
Por desgracia, esto devuelve una lista anidada, que tendrá que recorrer en un bucle repeat with
o aplanar el nido en una simple lista (lo que no es demasiado difícil).
La ejecución de AppleScript desde la línea de comandos tiene la ventaja de que los datos devueltos están en formato de texto, que puede ser manipulado con bastante facilidad. Incluso puede hacer uso de la línea de comandos desde AppleScript para obtener las ventajas de cada uno:
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
que devuelve una bonita lista de texto de los títulos de las ventanas.
Por último, aquí hay un AppleScript formal para hacer el trabajo correctamente, de una manera que le permite mantener la capacidad de hacer referencia al objeto ventana si necesita obtener otras propiedades o manipularlo:
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
La lista resultante es una lista de registros que tienen la estructura de property R
. Cada registro representa una sola ventana, que contiene el título de la ventana y el nombre del proceso al que pertenece, por ejemplo {WindowTitle:"Downloads", AttachedToProcess:"Finder"}
. De esta manera, es fácil hacer cosas con la ventana, como:
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}]