Я хочу написати сценарій, який виводить список всіх заголовків вікон усіх запущених програм.
Легкий, один-лайнерний метод досягнення цього в AppleScript:
tell application "System Events" to get the name of every window of ¬
(every process whose background only is false)
Невпевнено, це повертає вкладені списки, які вам доведеться або провести через a repeat with
блокувати або вирівнювати гніздо в простий список (що не надто складно).
Запуск AppleScript з командного рядка має ту перевагу, що повернені дані знаходяться в текстовому форматі, який можна легко обробляти. Можна навіть скористатися командним рядком з AppleScript, щоб отримати переваги кожного з них:
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
який повертає гарний, прямий, текстовий список назв вікон.
Нарешті, ось формальний AppleScript, щоб виконати роботу належним чином, таким чином, що дозволяє зберегти можливість посилатися на об'єкт вікна, якщо потрібно отримати інші властивості або керувати ним:
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
Отриманий список - це список записів, що мають структуру property R
. Кожен запис являє собою єдине вікно, яке містить назву вікна та назву процесу, до якого він належить, наприклад. {WindowTitle:"Downloads", AttachedToProcess:"Finder"}
. Таким чином, легко робити речі з вікном, наприклад:
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}]