UIScripting
SEITENINHALT
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:
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:
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:
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:
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.
ICQ
AIM

