Modification de la résolution écran par Applescript

 

S'il existait un complément de pilotage sous OS9 pour modifier la résolution de l'écran (Jon's Commands), ce n'est pas le cas pour Mac OS X.

Malgré mes recherches, je n'ai pas trouver aucune commande gratuite permettant de réaliser cette opération sur Mac OS X Tiger. On notera toutefois que le complément de pilotage "Extra Suites" de chez www.kanzu.com comporte une telle commande mais il vous en coutera $10.

Voici donc une méthode qui permet de modifier toute l'interface du Mac et de piloter des applications qui ne sont pas scriptables. Au passage, elle nous servira à modifier la résolution de l'écran par Applescript.

Cette méthode fait appel à la possibilité de scripter directement l'interface de Mac OSX par l'accès aux périphériques d'aide.

Lisez tout d'abord la page suivante: http://www.apple.com/applescript/uiscripting/index.html pour bien en comprendre le principe et télécharger l'utilitaire UIElementInspector. Celui-ci vous sera d'un grand secours pour scripter d'autres parties de l'interface Mac OS X.

N'oubliez pas non plus de cocher "Activer l'accès pour les périphériques d'aide" dans les préférences d'accès universel.

La réalisation du script est maintenant aisée: Il suffit de modifier par script la ligne sélectionnée de la résolution écran dans les préférences système.

Pour cela repérons la hiérarchie de la ligne de résolution visée dans les préférences système grâce à l'utilitaire UIElementInspector

Ce qui nous donne:

<AXApplication: “Préférences Système”>

 <AXWindow: “iMac”>

  <AXTabGroup>

   <AXGroup>

    <AXScrollArea>

     <AXTable>

      <AXRow>

       <AXTextField>


Attributes:

   AXRole:  “AXTextField”

   AXRoleDescription:  “champ de texte”

   AXHelp:  “(null)”

   AXValue (W):  “800 x 600”

   AXEnabled:  “1”

   AXFocused:  “0”

   AXParent:  “<AXRow>”

   AXWindow:  “<AXWindow: “iMac”>”

   AXTopLevelUIElement:  “<AXWindow: “iMac”>”

   AXPosition:  “x=422 y=271”

   AXSize:  “w=179 h=17”

   AXChildren:  “<array of size 0>”

   AXSelectedText:  “(null)”

   AXSelectedTextRange:  “(null)”

   AXNumberOfCharacters:  “9”

   AXVisibleCharacterRange:  “pos=0 len=9”

   AXInsertionPointLineNumber:  “(null)”


Actions:

   AXShowMenu - Afficher le menu

   AXConfirm - confirmer

Comme vous pouvez le constater, nous n'avons pas l'index pour Tab Group, Group, Scroll area, etc. Nous ne connaissons que la hiérarchie des objets et le nom de la fenêtre.

Un petit script nous permettra de nous en sortir:

tell application "System Preferences"

activate

set current pane to pane "com.apple.preference.displays"

end tell


tell application "System Events"

tell process "System Preferences"

tell window "iMac"

get entire contents

end tell -- window

end tell -- application process

end tell -- "System Events"

 

Parmi les résultats, nous observons les lignes suivantes:

text field 1 of row 1 of table 1 of scroll area 1 of group 1 of tab group 1 of window "iMac" of application process "System Preferences" of application "System Events".


Même chose pour row 2 et row 3

Voyons ce que contient row 2:

tell application "System Events"

get value of text field 1 of row 2 of table 1 of scroll area 1 of group 1 of tab group 1 of window "iMac" of application process "System Preferences" of application "System Events"

end tell


Le résultat est "800 x 600" ! C'est tout à fait ce que nous recherchons.

Il ne reste maintenant plus qu'à activer cette résolution:

tell application "System Preferences"

activate

set current pane to pane "com.apple.preference.displays"

end tell


tell application "System Events"

set selected of row 2 of table 1 of scroll area 1 of group 1 of tab group 1 of window "iMac" of application process "System Preferences" to true

end tell -- "System Events"


Voila ! Le tour est joué et la résolution de l'écran changée.

Vous pourrez utiliser cette méthode dans tous les cas où vous souhaitez piloter une application qui n'est pas directement scriptable. Il faut être patient mais le résultat est à la hauteur de l'attente.

Bon amusement,

Patrick