¿Puedo usar AppleScript para detectar si hay ventanas en la pantalla?

1

Tengo un script de bash que requiere saber si hay ventanas en la pantalla actual. No pude hacerlo en bash así que tal vez hay una manera. Además, si pudiera encontrar si hay una ventana activa (si hay ventanas en la pantalla) sería genial pero no es tan importante. Gracias

    
pregunta user2420562 22.02.2018 - 16:29

1 respuesta

3

Esta es una de esas tareas que, en la superficie, es bastante simple de realizar, pero cuando experimenta un poco más, puede resultar un poco complicado, ya que no todas las aplicaciones o ventanas de aplicaciones informan de sus propiedades o Atributos completamente veraz todo el tiempo.

Esta línea de AppleScript es la forma más convencional y comúnmente utilizada para obtener una lista de ventanas abiertas de las aplicaciones que se ejecutan en su sistema:

    tell application "System Events" to ¬
        get every window of every process whose background only is false

Esto le dará una lista de incluso aquellas ventanas que actualmente están minimizadas y se encuentran debajo de su icono de base. Puede obtener una lista de solo las ventanas que no están minimizadas y, por lo tanto, visibles en su pantalla en ese momento:

    tell application "System Events" to ¬
        get every window of (every process whose visible is true)

Sin embargo, esto a veces no detectará algunas ventanas de aplicaciones de fondo solamente (algunas aplicaciones de la barra de menú) que no informan como visibles incluso cuando sus ventanas están abiertas. Entonces, para atraparlos, puedes usar esto:

    tell application "System Events" to get windows of ¬
        (every process whose class of windows contains window) ¬
            whose value of attribute "AXMinimized" is false

Esto tiene la buena ventaja de que solo se devuelven nidos de listas no vacías en AppleScript, es mi método favorito para usar como uno que captura solo el fondo, ventanas "invisibles".

Para llamar a estos comandos desde bash, puedes usar esto:

    osascript \
        -e 'tell application "System Events"' \
        -e '    get every window of (every process ¬' \
        -e '        whose background only is false  ¬' \
        -e '        and visible is true)' \
        -e 'end tell'

Esta es la combinación de los dos primeros ejemplos que proporcioné, que devuelve una lista de ventanas delimitada por comas, denotada por sus títulos, como esta:

,,, window Edit - Ask Different of application process Safari,, \
    window ~ — osascript  /Users/CK — ttys000 — ⌘1 of application process Terminal,, \
    window Untitled 2 of application process Script Editor, \
    window Messages of application process Script Editor, \
    window Library of application process Script Editor

(He dividido la salida en varias líneas para facilitar la lectura). Tenga en cuenta las tres comas principales, que, en AppleScript, son donde se obtendrían las listas de agrupamiento vacías que se presentan como resultado de los procesos que están visibles y en primer plano. , pero simplemente no tiene ninguna ventana abierta, por lo tanto, devuelve {} en AppleScript, que se convierte en una cadena vacía "" en stdout .

Como puede ver, tengo abierta esta ventana Safari ; una ventana Terminal abierta; y tres ventanas Script Editor abiertas. Sin embargo, , se perdió mi ventana de alimentación Instagram . Aquí está el otro ejemplo ejecutado en bash:

    osascript \
        -e 'tell application "System Events" to ¬' \
        -e '    get every window of (every process ¬' \
        -e '        whose class of windows contains window) ¬' \
        -e '    whose value of attribute "AXMinimized" is false'

que me devuelve esto ahora mismo:

    window Edit - Ask Different of application process Safari, \
    window ~ — osascript  /Users/CK — ttys000 — ⌘1 of application process Terminal, \ 
    window Untitled 2 of application process Script Editor, \
    window Messages of application process Script Editor, window Library of application process Script Editor, \
    window Main Window of application process Flume

( Flume es mi aplicación de Instagram). Sin embargo, el costo de usar este método es un poco más de tiempo de procesamiento (un par de segundos).

Finalmente, si todo lo que necesita es solo el número real de ventanas abiertas en su pantalla para determinar si esto no es cero o lo que sea, entonces simplemente intercambie get every window... con get the number of (windows...) en cualquier método que elija usar .

Nota: Algunos de estos comandos pueden funcionar de manera diferente en sistemas más antiguos. Los probé en Mac OS 10.13 utilizando AppleScript 2.7. Sin embargo, muy ocasionalmente, System Events puede generar un error. Por favor, ejecute el comando de nuevo. Esto no es un problema con el script, sino un problema con Eventos del sistema y su comportamiento temperamental ocasional.

    
respondido por el CJK 23.02.2018 - 03:22

Lea otras preguntas en las etiquetas