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

Tengo un script de bash que requiere saber si hay ventanas en la pantalla actual. No podría 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) eso sería genial, pero no es tan importante. Gracias

Esta es una de esas tareas que, en la superficie de la misma, 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 sus propiedades o atributos de forma totalmente 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 fondo, solo las aplicaciones (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 devolver solo los nidos de listas no vacías en AppleScript, es mi método favorito para usar como uno que captura solo el fondo, las 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 di, 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 obtendría 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, devuelva {} en AppleScript, que se convierte en una cadena "" vacía en la stdout .

Como puedes ver, tengo esta ventana de Safari abierta; una ventana de Terminal abierta; y tres ventanas de Script Editor abiertas. Sin embargo , se perdió mi ventana de feed de 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, simplemente intercambie get every window... con get the number of (windows...) en cualquier Método que terminas eligiendo para 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, los eventos del sistema pueden arrojar un error. Por favor, ejecute el comando de nuevo. Este no es un problema con el script, sino un problema con los eventos del sistema y su comportamiento temperamental ocasional.