Tengo un script en bash que se requiere para saber si hay cualquier windows en la pantalla actual. Yo no podía hacerlo en bash, así que tal vez hay una manera. También, si podía encontrar si hay una ventana activa (si hay ventanas en la pantalla) que sería genial, pero no es importante. Gracias
Respuesta
¿Demasiados anuncios?Esta es una de esas tareas que, en la superficie de la misma, es bastante simple de hacer, pero cuando experimento un poco más, resulta que puede ser un poco difícil, ya que no todas las aplicaciones o ventana de aplicación de los informes de sus propiedades o atributos completamente con la verdad todo el tiempo.
Esta línea de AppleScript es el más convencional y comúnmente utilizada para obtener una lista de las 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 aquellas ventanas que actualmente están minimizados y sentado debajo de su icono del dock. Usted puede obtener una lista de aquellas ventanas que no se reduce al mínimo, y por lo tanto visible en la pantalla en ese momento:
tell application "System Events" to ¬
get every window of (every process whose visible is true)
Sin embargo, ocasionalmente se pierde la detección de algunas ventanas de sólo el fondo de aplicaciones de la barra de menú de aplicaciones) que no se informe de como ser visibles incluso cuando las ventanas están abiertas. Así, para atrapar a esos, puedes usar este:
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 ventaja de devolver sólo los no-nidos vacíos de listas en AppleScript, es mi método favorito para usar como uno que coge sólo el fondo, "invisible" de windows.
Para llamar a estos comandos de bash, puede utilizar 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 me dio, que devuelve una lista delimitada por comas de windows que se denota por sus títulos, como este:
,,, 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 a través de varias líneas para la lectura). Nota de los tres principales comas, que, en AppleScript, donde obtendrá vacío de anidamiento de listas con como resultado de los procesos que son visibles y en primer plano, pero simplemente no tienen todas las ventanas abiertas, así regresar {}
en AppleScript, que se convierte en una cadena vacía ""
en stdout
.
Como puedes ver, tengo este Safari ventana abierta, un Terminal de la ventana abierta; y tres Editor de secuencias de Comandos de windows abierto. Sin embargo, se perdió mi Instagram feed ventana. Aquí hay otro ejemplo de ejecución 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 devuelve esto para mí 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
(Canal es mi Instagram app.) Sin embargo, el costo de usar este método es un poco más tiempo de procesamiento (un par de segundos).
Por último, si todo lo que usted necesita es sólo el número real de las ventanas abiertas en la pantalla para determinar si este es distinto de cero, o lo que sea, entonces simplemente intercambie get every window...
con get the number of (windows...)
en cualquiera que sea el método a elegir para su uso.
Nota: Algunos de estos comandos pueden funcionar de manera diferente en los sistemas más antiguos. He probado en Mac OS 10.13 usando AppleScript 2.7. Sin embargo, muy de vez en cuando, los Eventos del Sistema se puede producir un error. Por favor, ejecute el comando de nuevo. Este no es un problema con el script, pero un problema con los Eventos del Sistema y sus ocasionales temperamental comportamiento.