¿Hay alguna manera de obtener una lista de todos los títulos de ventanas de programas que se ejecutan actualmente con AppleScript?

0

Estoy buscando escribir un script que genere una lista de todos los títulos de las ventanas de todos los programas que se ejecutan actualmente. ¿Hay alguna forma de hacer esto con AppleScript? Intenté ejecutar el siguiente código:

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

Lo puse en un archivo llamado lawl.scpty luego ejecuté lo siguiente en la Terminal:

$ osascirpt lawl.scpt

Sin embargo, solo hace una pausa por unos segundos, luego sale sin generar nada.

Claudiu
fuente
vea esto para saber cómo: apple.stackexchange.com/a/115373/46541
Ruskes
Vea esta pregunta , especialmente la respuesta de Raymond para una solución corta.
Asmus

Respuestas:

1

Estoy buscando escribir un script que genere una lista de todos los títulos de las ventanas de todos los programas que se ejecutan actualmente.

El método sencillo y sencillo 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)

Molesto, esto devuelve una lista anidada, que tendrás que recorrer en un repeat withbloque o aplanar el nido en una lista simple (que no es demasiado difícil).

Ejecutar AppleScript desde la línea de comandos tiene la ventaja de que los datos devueltos están en formato de texto, que puede manipularse con bastante facilidad. Incluso puede utilizar la línea de comandos desde AppleScript para obtener los beneficios 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 buena lista de texto de títulos de ventanas.

Finalmente, aquí hay un AppleScript formal para hacer el trabajo correctamente, de una manera que le permita conservar la capacidad de hacer referencia al objeto de 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}]
CJK
fuente
Probablemente no como lo haría ahora. Un filtro mejor que background onlysería algo como esto: get the name of every window of (every process whose class of windows contains window).
CJK