J'ai un script bash qui a besoin de savoir s'il y a des fenêtres sur l'écran actuel. Je n'ai pas pu le faire en bash, peut-être qu'il y a une solution. De plus, si je pouvais savoir s'il y a une fenêtre active (s'il y a des fenêtres à l'écran), ce serait génial mais ce n'est pas si important. Merci
Réponse
Trop de publicités?C'est l'une de ces tâches qui, en apparence, est assez simple à réaliser, mais qui se révèle un peu délicate lorsque vous expérimentez un peu plus, car toutes les applications ou fenêtres d'application ne rapportent pas toujours leurs propriétés ou attributs de manière entièrement véridique tout le temps.
Cette ligne d'AppleScript est la manière la plus conventionnelle et couramment utilisée pour obtenir une liste des fenêtres ouvertes des applications en cours d'exécution sur votre système :
dire à l'application "Événements système" de ¬
obtenir chaque fenêtre de chaque processus dont le fond seulement est faux
Cela vous donnera une liste même de ces fenêtres qui sont actuellement réduites et se trouvent sous leur icône de dock. Vous pouvez obtenir une liste uniquement de ces fenêtres qui ne sont pas réduites, et donc visibles à l'écran à ce moment-là :
dire à l'application "Événements système" de ¬
obtenir chaque fenêtre de (chaque processus dont visible est vrai)
Cependant, cela peut parfois ne pas détecter certaines fenêtres d'applications en arrière-plan (certains applications de barre de menus) qui ne se signalent pas comme étant visibles même lorsque leurs fenêtres sont ouvertes. Ainsi, pour les attraper, vous pouvez utiliser ceci :
dire à l'application "Événements système" d'obtenir les fenêtres de ¬
(chaque processus dont la classe des fenêtres contient fenêtre) ¬
dont la valeur de l'attribut "AXMinimized" est faux
Cela a l'avantage agréable de ne renvoyer que des nids de listes non vides en AppleScript, c'est ma méthode préférée à utiliser car elle capture les fenêtres en arrière-plan uniquement, "invisibles".
Pour appeler ces commandes à partir de bash, vous pouvez utiliser ceci :
osascript \
-e 'dire à l'application "Événements système"' \
-e ' obtenir chaque fenêtre de (chaque processus ¬' \
-e ' dont le fond seulement est faux ¬' \
-e ' et visible est vrai)' \
-e 'fin dire'
C'est la combinaison des deux premiers exemples que j'ai donnés, qui renvoie une liste des fenêtres délimitée par des virgules indiquant leurs titres, comme ceci :
,,, fenêtre Edition - Ask Different du processus d'application Safari,, \
fenêtre ~ — osascript /Users/CK — ttys000 — 1 du processus d'application Terminal,, \
fenêtre Sans titre 2 du processus d'application Éditeur de script, \
fenêtre Messages du processus d'application Éditeur de script, \
fenêtre Bibliothèque du processus d'application Éditeur de script
(J'ai divisé la sortie sur plusieurs lignes pour faciliter la lecture.) Notez les trois virgules initiales, qui, en AppleScript, sont là où vous obtiendriez des listes imbriquées vides en raison des processus visibles et au premier plan, mais qui n'ont tout simplement pas de fenêtres ouvertes, renvoyant ainsi {}
en AppleScript, ce qui devient une chaîne vide ""
dans stdout
.
Comme vous pouvez le voir, j'ai cette fenêtre Safari ouverte ; une fenêtre Terminal ouverte ; et trois fenêtres Éditeur de script ouvertes. Cependant, il a raté ma fenêtre de fil d'actualité Instagram. Voici l'autre exemple exécuté dans bash :
osascript \
-e 'dire à l'application "Événements système" de ¬' \
-e ' obtenir chaque fenêtre de (chaque processus ¬' \
-e ' dont la classe des fenêtres contient fenêtre) ¬' \
-e ' dont la valeur de l'attribut "AXMinimized" est faux'
ce qui me renvoie ceci pour le moment :
fenêtre Edition - Ask Different du processus d'application Safari, \
fenêtre ~ — osascript /Users/CK — ttys000 — 1 du processus d'application Terminal, \
fenêtre Sans titre 2 du processus d'application Éditeur de script, \
fenêtre Messages du processus d'application Éditeur de script, fenêtre Bibliothèque du processus d'application Éditeur de script, \
fenêtre Fenêtre principale du processus d'application Flume
(Flume est mon application Instagram.) Cependant, l'inconvénient d'utiliser cette méthode est un peu plus de temps de traitement (quelques secondes).
Enfin, si tout ce que vous avez besoin est simplement le nombre réel de fenêtres ouvertes sur votre écran pour déterminer si cela n'est pas nul ou autre chose, alors remplacez simplement obtenir chaque fenêtre...
par obtenir le nombre de (fenêtres...)
dans la méthode que vous choisissez d'utiliser.
Remarque : Certaines de ces commandes peuvent fonctionner différemment sur les anciens systèmes. J'ai testé celles-ci sur Mac OS 10.13 en utilisant AppleScript 2.7. Cependant, très occasionnellement, Événements système peut renvoyer une erreur. Veuillez exécuter la commande à nouveau. Ce n'est pas un problème avec le script, mais un problème avec Événements système et son comportement parfois capricieux.