3 votes

Comment pouvez-vous trouver quel moniteur a la barre de menu en AppleScript?

En jouant avec AppleScript, je veux manipuler l'emplacement de quelques fenêtres avec position mais j'ai du mal à définir le moniteur. Actuellement, j'ai plusieurs moniteurs de tailles et de marques différentes auxquels je me connecte avec mon MacBook lors de mes déplacements. La seule occurrence commune avec les quatre moniteurs auxquels je me connecte est que le moniteur que je veux manipuler inclut la barre de menu.

En testant avec do shell script "system_profiler SPDisplaysDataType je ne suis pas sûr si le texte retourné de Main Display: Yes considère le principal être là où se trouve la barre de menu à partir de l'extraction :

Graphics/Displays:

    Intel Iris Pro:

      Chipset Model: Intel Iris Pro
      Type: GPU
      Bus: Intégré
      VRAM (Dynamic, Max): 1536 Mo
      Métal : Pris en charge
      Affichages :
        Écran couleur LCD :
          Type d'affichage : Écran Retina LCD intégré
          Résolution : 2880 x 1800 Retina
          Miroir : Désactivé
          En ligne : Oui
          Rotation : Pris en charge
          Ajuster automatiquement la luminosité : Oui
          Type de connexion : DisplayPort
        Écran Thunderbolt :
          Type d'affichage : LCD
          Résolution : 2560 x 1440
          Écran principal : Oui
          Miroir : Désactivé
          En ligne : Oui
          Rotation : Pris en charge
          Ajuster automatiquement la luminosité : Non
          Type de connexion : DisplayPort

Si mon hypothèse concernant le Main Display est correcte, comment devrais-je grep correctement la résolution de l'affichage principal identifié afin de pouvoir manipuler les fenêtres ?

Lorsque je fais des recherches, il semble que certaines personnes se contentent d'entrer dans chaque affichage :

Je ne sais donc pas si cela constituerait deux questions en une. Je suis quelque peu perplexe sur la manière dont la séquence est déterminée lors de la connexion à plusieurs moniteurs (par exemple, aujourd'hui je pourrais être connecté à un écran Thunderbolt mais demain je pourrais être connecté à deux moniteurs Dells via mes deux DisplayPorts) et s'il y a un moyen de cibler un moniteur en particulier en fonction de la barre de menu.

Je peux déjà détecter l'application et sa taille avec :

tell application "System Events" to tell application process "Notes" to set theSize to get size of window 1
set theWidth to item 1 of theSize
set theHeight to item 2 of theSize

mais mon problème réside dans la détermination de la résolution afin de pouvoir calculer la position et les bounds pour déplacer la fenêtre de l'application.

3voto

wch1zpink Points 6067

MISE À JOUR

J'ai supprimé ma réponse originale. Voici une approche totalement différente que je préfère à ma solution initiale. Cette version utilise en fait l'addition de script "Image Events".

Ce script permet d'obtenir les noms des écrans connectés à votre ordinateur. Les valeurs renvoyées de "display "Display 1" seront toujours "quel moniteur a la barre de menu dans AppleScript ?"

property activeDesktop : valeur manquante
property activeDesktopResolution : valeur manquante

set displayNames to {}

tell application "Image Events"
    set theDisplays to displays
    repeat with i from 1 to number of items in theDisplays
        set this_item to item i of theDisplays
        set theName to name of display profile of item i of theDisplays
        set end of displayNames to theName
        set activeDesktop to item 1 of displayNames
    end repeat
end tell

tell application "Finder"
    set activeDesktopResolution to bounds of window of desktop
    set activeDesktopResolution to items 3 thru 4 of activeDesktopResolution
end tell

set theResultz to display dialog activeDesktop & "  " & item 1 of activeDesktopResolution & " x " & item 2 of activeDesktopResolution ¬
    buttons ¬
    "OK" with title ¬
    "Votre écran actuel et sa résolution" with icon 1 ¬
    giving up after 10

entrer la description de l'image ici entrer la description de l'image ici entrer la description de l'image ici entrer la description de l'image ici entrer la description de l'image ici

2voto

user3439894 Points 52496

Testé sur mon MacBook Pro avec un Thunderbolt Display connecté et la Barre de Menus dessus, ce qui suit a fonctionné :

set theMainDisplayName to do shell script "system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'"
return theMainDisplayName

Résultat :
"Thunderbolt Display:"

Si je déplace la Barre de Menus sur le MacBook Pro, il renvoie le nom de l'Écran de celui-ci, au lieu du nom du Thunderbolt Display.

Pour la Résolution de mon Thunderbolt Display :

set theMainDisplayResolution to do shell script "system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'"
return theMainDisplayResolution

Résultat:
"2560 x 1440"

Si je déplace la Barre de Menus sur le MacBook Pro, il renvoie la résolution de l'Écran de celui-ci, au lieu de la résolution du Thunderbolt Display.


Jetez également un œil à mes réponses à, Script pour relocaliser la barre de menus sur une configuration à double moniteur et Changer la disposition de l'écran dans OS X de manière programmable pour quelques utilitaires tiers que vous pourriez également trouver utiles.

Note : Je n'ai aucun lien avec les développeurs des utilitaires mentionnés et utilisés dans mes réponses dans les liens ci-dessus.


Comprendre un peu les commandes shell utilisées dans les do shell script commandes :

Partie de commande de la do shell script commande :

system_profiler SPDisplaysDataType | grep -B 5 'Main Display:' | awk '{sub(/^[ \t]+/, \"\"); print $0; exit}'
  • system_profiler - Rapporte la configuration matérielle et logicielle du système.
    • SPDisplaysDataType - Génère un rapport texte contenant des informations sur les graphiques et les écrans.
  • | Redirecteur permettant de diriger la sortie de la commande suivante vers l'entrée de la commande suivante.
  • grep - Chercheur de motifs de fichiers. L'utilitaire grep recherche les lignes des fichiers d'entrée qui correspondent à un ou plusieurs modèles.
    • B num - Affiche num lignes de contexte précédent chaque correspondance.
    • 'Main Display:' Motif à rechercher.
  • | Redirecteur permettant de diriger la sortie de la commande suivante vers l'entrée de la commande suivante.
  • awk - Langage d'analyse et de traitement dirigé par modèle.
    • sub(/^[ \t]+/, \"\") - Fonction de substitution de chaîne - sub(regexp, remplacement) - Utilisé dans ce cas pour supprimer l'espace vide initial.
      • ^ - Indique la position au début de la chaîne.
      • [ \t] - Correspond à un caractère unique présent dans la liste.
        • espace - Correspond au caractère espace littéralement. Notez que l'espace est utilisé ici pour indiquer un seul caractère d'espace (ASCII 32).
        • \t - Correspond à un caractère de tabulation (ASCII 9).
      • + - Correspond entre une et un nombre illimité de fois, autant de fois que possible, en fonction des besoins (avide).
      • \"\" - Le remplacement se fait avec rien (""). Les "" sont échappés, \, de sorte que la commande puisse être compilée et passée au shell. Si elle est saisie directement sur la ligne de commande, les "" n'auraient pas besoin d'être échappés.
    • print $0 - Imprime l'enregistrement complet. - Dans ce cas, il imprime la cinquième ligne au-dessus de Main Display:, sans l'espace vide initial.
    • exit - Sort après avoir imprimé le premier enregistrement.

Partie de commande de la do shell script commande :

system_profiler SPDisplaysDataType | grep -B 3 'Main Display:' | awk '/Resolution:/{print $2,$3,$4}'

Dans cette do shell script commande la partie awk '/Resolution:/{print $2,$3,$4}' fait ce qui suit :

La sortie par exemple :

$ system_profiler SPDisplaysDataType | grep -B 3 'Main Display:'
          Resolution: 2560 x 1440
          Pixel Depth: 32-Bit Color (ARGB8888)
          Display Serial Number: C08Z4120F6FB
          Main Display: Yes
$

Est passée à awk et il recherche dans l'entrée un enregistrement contenant Résolution: ce qui trouve la correspondance suivante :

          Resolution: 2560 x 1440

La commande print $2,$3,$4, imprime le deuxième, troisième et quatrième champs de l'enregistrement. La virgule , entre les $n champs sert à insérer un espace. L'sortie de cela est :

2560 x 1440

2voto

Dans mes tests, vous avez raison, l'affichage principal est celui auquel le menu est assigné dans les préférences Système des affichages. J'ai testé en déplaçant la barre de menu d'un affichage à l'autre et en exécutant votre script. Les résultats suggèrent que l'endroit où se trouve la barre de menu, cet affichage aura "Affichage principal : Oui" dans ses informations.

Pour analyser la résolution, j'utiliserais l'argument -xml de la commande system_profiler pour obtenir un texte cohérent à rechercher, puis utiliser les délimiteurs d'éléments de texte d'Apple pour analyser les données. J'ai écrit ce script et quand je bascule le menu d'un écran à l'autre, il retourne la résolution de l'écran principal actuel. Vous devrez peut-être ajuster les délimiteurs en fonction de ce que votre OS retourne pour le rapport du profilateur système.

J'ai ajouté des commentaires en ligne dans le code ci-dessous pour expliquer ce que fait le script.

set pfl to do shell script "system_profiler -xml SPDisplaysDataType"

set tid to text item delimiters
set text item delimiters to "_name"--dans mes rapports, chaque section d'affichage commence par ce code xml

ignorer les espaces blancs --nous permet de ne pas nous soucier des retours, tabs, espaces, etc.
    répéter avec i de 2 à la quantité d'éléments de texte de pfl
        set aDisplay to pfl's text item i
        si aDisplay contient "spdisplays_mainspdisplays_yes" then--vérifier si cet affichage est le principal
            set text item delimiters to "_spdisplays_resolution"--c'est le code xml pour la résolution
            set displayRes to aDisplay's text item 2
            set text item delimiters to "

`EDIT : Parce que vous avez posté la forme régulière du system_profiler ci-dessus, j'ai réécrit le script pour analyser cette sortie. Cela me semble un peu plus risqué que d'utiliser le xml, mais il devrait compiler et s'exécuter correctement sur votre système sans aucun ajustement.

set pfl to do shell script "system_profiler SPDisplaysDataType"
set tid to text item delimiters
set text item delimiters to "Displays:"
set pfl to texte 3 de pfl
set text item delimiters to "Mirror:"
répéter avec i de 1 à la quantité d'éléments de texte de pfl
    set aDisplay to pfl's texte i
    en ignorant les espaces blancs
        si aDisplay contient "Affichage principal : Oui" then
            si aDisplay contient "Résolution :" then
                set text item delimiters to "Résolution :"
                set displayRes to texte 2 de aDisplay
                en tenant compte des espaces blancs
                    set text item delimiters to "\r" --les sauts de ligne devraient être \r
                    set displayRes to texte 1 de displayRes
                    set text item delimiters to "\n" --ou ils pourraient être \n
                    set displayRes to texte 1 de displayRes
                fin en tenant compte
            fin si
        fin si
    fin en ignorant
    set text item delimiters to "Miroir :"
fin répéter
set text item delimiters to tid
return displayRes`

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X