Чи є спосіб отримати список всіх назв вікон програми, які зараз запущені, за допомогою AppleScript?


0

Я хочу написати сценарій, який виводить список всіх заголовків вікон усіх запущених програм. Чи є спосіб зробити це за допомогою AppleScript? Я спробував запустити такий код:

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

Я поклав його у файл з назвою lawl.scpt а потім виконав наступне в терміналі:

$ osascirpt lawl.scpt

Тим не менш, він просто зупиняється на кілька секунд, потім виходить, не виводячи нічого.


перегляньте це, як: apple.stackexchange.com/a/115373/46541
Buscar웃

Подивитися це питання , особливо відповідь Раймонда для короткого рішення.
Asmus

Відповіді:


1

Я хочу написати сценарій, який виводить список всіх заголовків вікон усіх запущених програм.

Легкий, один-лайнерний метод досягнення цього в 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}]

Напевно, не так, як я це зробив би зараз. Кращий фільтр, ніж background only виглядатиме приблизно так: get the name of every window of (every process whose class of windows contains window).
CJK
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.