START > APPLESCRIPT > UIScripting

UIScripting

Was ist UIScripting?

UIScripting ermöglicht es, Programme über das GUI (Graphical User Interface) zu skripten. Das bedeutet im Prinzip nichts anderes, als die Bedienung der grafischen Oberfläche per AppleScript. Es werden also Menüs, Buttons, Radio-Buttons, aber auch Textfelder etc. wie «von Geisterhand» per AppleScript-Code bedient.

Mit UIScripting lassen sich klassische Maus- sowie Tastatur-Aktionen per AppleScript ausführen. So kann man z.B. aufpoppende Abfragen per Return-Taste bestätigen (nur ein Beispiel), die sich sonst nicht skripten lassen, da sich für die auszuführende Aktion vielleicht keine Befehle in der Bibliothek des Programms befinden. Im Prinzip ließe sich damit quasi alles skripten, was auch «zu Fuß» zu erledigen wäre.

Das klingt zwar zunächst recht vielversprechend, ist in der Praxis aber aufwändig zu skripten und eine wackelige Angelegenheit, allein durch die Tatsache, daß auf die äußeren Umgebungs-Einflüsse eingegangen werden muß. Es ist oftmals schwierig (manchmal unmöglich), die einzelnen UI-Elemente (Buttons, Scrollbalken, Textfelder) gezielt und korrekt anzusprechen. Kurz: UIScripting sollte man nur einsetzen, wenn nichts anderes mehr geht, und die AppleScript-Bibliothek des zu skriptenden Programms keine bessere Möglichkeit her gibt.

Manchmal kommt man mit UIScripting aber auch quick & dirty ans Ziel, wenn man keine Lust hat, sich großartig mit der AppleScript-Bibliothek des Programms auseinander zu setzen um schnell mal eine kleine Aufgabe zu erledigen.

Die Befehle für's UIScripting werden von den «SystemEvents» zur Verfügung gestellt. Will man also UIScripting betreiben, sind immer die SystemEvents per tell-Befehl bzw. tell-Block anzusprechen. Wichtig ist außerdem, dass GUIScripting überhaupt auf dem System aktiviert ist (Systemeinstellungen > Bedienungshilfen > Zugriff für Hilfsgeräte aktivieren). Um in eigenen Applescripts, die von UIScripting Gebrauch machen, sicherzustellen, dass dies der Fall ist, habe ich hier einen Handler, der dies gewährleistet.



Tasten(folgen) senden (key code / keystroke)

key code

Mit einem so genannten key code lassen sich Tasten an beliebige Programme (auch solche, die kein AppleScript bieten) senden. So lassen sich z.B. Menübefehle, die auch über Tastaturbefehl erreichbar sind, per AppleScript mittels System-Events auslösen (z.B. ⌘Q für «Quit»).

Einem key code folgt immer eine Zahl, die die anzusprechende Taste repräsentiert (siehe auch «Tabelle der key codes»), gefolgt wiederum von evtl. Modifikations-Tasten. Will man z.B. das Programm iTunes per key code beenden, würde das folgendermaßen aussehen:

tell application "iTunes"
   activate
   tell application "System Events"
      key code 12 using {command down} -- Tastenkombination "Apfel-Q"
   end tell
end tell
 Im Scripteditor öffnen

key code 12 steht hier für die Taste «q», und wird per using {command down} mit der Befehlstaste [⌘] kombiniert.

keystroke

Mit keystroke lassen sich ebenfalls einzelne Tasten, aber auch ganze Tastenfolgen (strings) an Programme senden. Damit lassen sich beispielsweise komplette Textfelder ausfüllen, oder evtl. PopUps per Text auswählen (sofern dies «zu Fuß» ebenfalls über die Tastatur möglich ist). Das vorherige Beispiel ließe sich also auch mittels keystroke ausführen:

tell application "iTunes"
   activate
   tell application "System Events"
      keystroke "q" using {command down} -- Tastenkombination "Apfel-Q"
   end tell
end tell
 Im Scripteditor öffnen

Als Modifikations-Tasten stehen

die Apfel-Taste [⌘] mit using {command down},  

die Alt-Taste [⎇] mit using {option down}, sowie 

die Shift-Taste [⇧] mit  using {shift down} zur Verfügung.


Will man mehrere Tasten kombinieren (z.B. ⇧⌘S) würde man

keystroke "s" using {shift down, command down} verwenden.


Die Befehle key code und keystroke müssen immer an die System-Events gerichtet werden, also immer innerhalb eines tell application "System Events"-Block stehen bzw. mit tell application "System Events" to ... eingeleitet werden, da sie nicht zu den «Standard-Additions» gehören!

(Einen praktischen Handler, der das Senden von Tastenkombinationen per UIScripting vereinfacht, findet ihr hier).



Tasten gedrückt halten

Es gibt auch die Möglichkeit, Tasten per UIScripting über einen längeren Zeitraum gedrückt zu halten. Hier habe ich mal ein Beispiel dafür, bei dem die "a"-Taste fünf Sekunden lang gedrückt gehalten wird. Um die Funktion für das Auge sichtbar zu machen, starte ich zusätzlich die Tastaturübersicht, mit deren Hilfe deutlich wird, welche Taste wann und wie lang gedrückt wird:

tell application "KeyboardViewerServer" to launch
delay 2
tell application "System Events"
   tell process "KeyboardViewerServer"
      activate
      key down "a"
      delay 5 -- "a" wird 5 Sekunden gedrückt gehalten
      key up "a"
   end tell
end tell
 Im Scripteditor öffnen

Erstaunlicherweise liesse sich damit sogar simulieren, dass man mit dem Kopf auf die Tastatur fällt, denn es lassen sich eine ganze Reihe von Tasten mit solch einem Konstrukt gleichzeitig betätigen:

tell application "KeyboardViewerServer" to launch
delay 2
tell application "System Events"
   tell process "KeyboardViewerServer"
      activate
      key down "rtzuioghj "
      delay 5
      key up "rtzuioghj "
   end tell
end tell
 Im Scripteditor öffnen

Diese Funktion ist allerdings mit Vorsicht zu geniessen und man sollte in seinem Skript dafür Sorge tragen, dass alle Tasten, die gedrückt werden auch in jedem Fall wieder gelöst werden, da diese sonst hartnäckig dauerhaft wie von Geisterhand gedrückt bleiben.


Tabelle der «key codes»

=============================================================
  TABELLE    key codes    SYSTEM EVENTS IN APPLESCRIPT
-------------------------------------------------------------
  (Deutsche Apple USB-Tastatur, evtl. auch f. andere
   Tastaturen gültig, alle Angaben ohne Gewähr)
=============================================================
key code   1 = "s"              key code  33 = "ü"
key code   2 = "d"              key code  34 = "i"
key code   3 = "f"              key code  35 = "p"
key code   4 = "h"              key code  36 = [Return]
key code   5 = "g"              key code  37 = "l"
key code   6 = "y"              key code  38 = "j"
key code   7 = "x"              key code  39 = "ä"
key code   8 = "c"              key code  40 = "k"
key code   9 = "v"              key code  41 = "ö"
key code  10 = "^"              key code  42 = "#"
key code  11 = "b"              key code  43 = ","
key code  12 = "q"              key code  44 = "-"
key code  13 = "w"              key code  45 = "n"
key code  14 = "e"              key code  46 = "m"
key code  15 = "r"              key code  47 = "."
key code  16 = "z"              key code  48 = [Tab]
key code  17 = "t"              key code  49 = [Space]
key code  18 = "1"              key code  50 = "<"
key code  19 = "2"              key code  51 = [Bkw-Del]
key code  20 = "3"              key code  52 = [Return]
key code  21 = "4"              key code  53 = [Escape]   esc
key code  22 = "6"              key code  54 = [Command]
key code  23 = "5"              key code  55 = [Command]
key code  24 = "´"              key code  56 = [Shift]
key code  25 = "9"              key code  57 = [ShiftLock]
key code  26 = "7"              key code  58 = [Alt]
key code  27 = "ß"              key code  59 = [Ctrl]   ctrl
key code  28 = "8"              key code  60 = [Shift]
key code  29 = "0"              key code  61 = [Alt]
key code  30 = "+"              key code  62 = [Ctrl]   ctrl
key code  31 = "o"              key code  63
key code  32 = "u"              key code  64
-------------------------------------------------------------
key code  65 = NUM [,]          key code  97 = [F 6]
key code  66 = [ArrowRight]     key code  98 = [F 7]
key code  67 = NUM [*]          key code  99 = [F 3]
key code  68                    key code 100 = [F 8]
key code  69 = NUM [+]          key code 101 = [F 9]
key code  70 = [ArrowLeft]      key code 102
key code  71 = NUM [X]          key code 103 = [F11]
key code  72 = [ArrowDown]      key code 104
key code  73                    key code 105 = [F13]
key code  74                    key code 106 = [F16]
key code  75 = NUM [/]          key code 107 = [F14]
key code  76 = NUM [Enter]      key code 108
key code  77 = [ArrowUp]        key code 109 = [F10]
key code  78 = NUM [-]          key code 110
key code  79                    key code 111 = [F12]
key code  80                    key code 112
key code  81 = NUM [=]          key code 113 = [F15]
key code  82 = NUM [0]          key code 114 = [Help]
key code  83 = NUM [1]          key code 115 = [PgUp]
key code  84 = NUM [2]          key code 116 = [Home]
key code  85 = NUM [3]          key code 117 = [Fwd-Del]
key code  86 = NUM [4]          key code 118 = [F 4]
key code  87 = NUM [5]          key code 119 = [PgDwn]
key code  88 = NUM [6]          key code 120 = [F 2]
key code  89 = NUM [7]          key code 121 = [End]
key code  90                    key code 122 = [F 1]
key code  91 = NUM [8]          key code 123 = [ArrowLeft]
key code  92 = NUM [9]          key code 124 = [ArrowRight]
key code  93                    key code 125 = [ArrowDown]
key code  94                    key code 126 = [ArrowUp]
key code  95                    key code 127
key code  96 = [F 5]            key code 128 = "a"
=============================================================
ab 129 gehts wieder von vorn los (129 = "s", 130 = "d", usw.)

Wer auch Umlaute per key code abbilden will, der findet hier einen Workaround.

 

Wer einen der fehlenden keycodes noch entschlüsseln kann, der möge sich bitte melden (z.B. über die Kommentar-Funktion am Ende dieser Seite). Auch würde ich mich über Erfahrungsberichte mit amerikanischen oder anderen Tastaturen freuen.



Menüauswahl per UIScripting

Während das Tasten senden per GUIScripting einen sehr überschaubaren Befehlsumfang aufweist, ist es schon etwas aufwendiger, ein Menü über die UI-Elemente anzusteuern.

Hier geht's demnächst weiter...


Einen klasse Handler für die Menüauswahl per UIScripting gibt's hier.




Kommentar schreiben

Norbert Lindenthal |  08.06.2008, 15:44:11 |  Norbert@Lindenthal.com  84.175.103.67 = p54AF6743.dip0.t-ipconnect.de
Moin, iScript.Hier (http://hohabadu.de/?APPLESCRIPT/UIScripting) suchte ich, wie ich es hinbekomme, aus FileMaker heraus in SketchUp per System Events etwas einzutippen.Aus dem »Script Editor« sieht das so aus und funktioniert auch sicher:--Skriptanfangset konsolenText to "UI.beep"tell application "SketchUp" activate tell application "System Events" key code 48 --setzt die Einfügemarke in das Konsolentextfeld key code 48 --setzt die Einfügemarke in das Konsolentextfeld keystroke konsolenText --to "AXTextFiled" of "Ruby-Konsole keystroke return end tellend tell--SkriptendeBei Deinem UIScripting fehlt ein Beispiel, das den zu tippenden Text in einer Variablen übergibt. Deshalb schreibe ich Dir hier diesen Brief.Nun suche ich weiter, wie in Sketchup das Menü »Fenster« und dort drin das Submenü »Ruby-Konsole« geöffnet werden kann.Beste Grüße,werkwelt alias Norbert Lindenthal 



Powered By CMSimple Design By NMuD Top