How to: Pixelgenaue Steuerung des Mauscursors mit Makrotastatur und AutoHotkey
Den Mauszeiger pixelgenau platzieren:
Unmöglich – vielleicht denkt das jetzt der eine oder die andere. Beim Versuch, den Mauscursor auf einen bestimmten Punkt zu positionieren, springt er unerwartet um einige Pixel weiter. Doch das muss nicht passieren – denn es gibt Skriptsprachen, und es gibt Makrotastaturen.
Es ist Zeit, beides zu kombinieren. Mit der Kombination aus einer Makrotastatur, die benutzerdefinierte Aktionen auslösen kann, und AutoHotkey, einer leistungsstarken Skriptsprache, kann eine präzise Maussteuerung erreicht werden. Diese Methode ist besonders hilfreich für Personen, die viel mit Grafikdesign arbeiten, weil sie effizientere Arbeitsabläufe ermöglicht.
Was wir brauchen:
- Eine Software, nämlich die Skriptsprache AutoHotkey.
Inzwischen gibt es AutoHotkey in Version 2, aber für diese müsste ich mein wichtigstes Skript zunächst anpassen, daher gehe ich noch von Version 1.1 aus.
- Als Hardware eine Makrotastatur mit frei belegbaren Tasten.
Oft wird eine solche Tastatur entweder als programmierbare Tastatur bezeichnet, als Makrotastatur (wegen der Fähigkeit, Abfolgen von Tastendrücken, also Makros, wiederzugeben) oder als Kassen- bzw. POS(Point of Sale)-Tastatur (weil sie mit Produktnummern, Prozentsätzen für die Mehrwertsteuer und ähnlichem belegt werden kann).
Die meisten dieser Tastaturen haben abnehmbare transparente Tastenkappen, unter denen Zettel mit der jeweiligen Tastenbeschriftung eingeklemmt werden können.
Manche bieten stattdessen je Taste ein kleines OLED-Display, auf dem eine einfache Grafik oder eine Animation angezeigt werden kann.
Es bietet sich an, eine Makrotastatur zu wählen, deren Tasten matrixförmig angeordnet sind. Die in Form und Größe den Standard-Tastaturen nachempfundenen programmierbaren Tastaturen, die eher dazu dienen, ein benutzerdefiniertes Tastaturlayout zu nutzen, haben seitlich gegeneinander versetzte Tastenreihen. Dies ist beim Tippen angenehm, macht jedoch die Cursorsteuerung weniger intuitiv. Solange die Tasten auch mit den Funktionstasten ab F13 belegt werden können, spielt das konkrete Modell allerdings rein technisch gesehen keine Rolle.
Die Lösung: Wir nutzen die Funktionstasten F13 bis F24
Ich wollte keine schwer zu merkenden Tastenkombinationen erfinden und die einfacheren sind meistens schon reserviert. Eine mögliche Lösung dieses Dilemmas sind die Funktionstasten F13 bis F24. Diese Tasten sind auf den heute üblichen Standardtastaturen nicht vorhanden und deshalb gibt es auch wenig Software, die sich auf deren Vorhandensein verlässt.
Ideale Voraussetzungen also, um ein paar neue Shortcuts zu definieren, die garantiert nicht mit den schon auf den meisten Rechnern vorhandenen kollidieren.
An dieser Stelle jedoch eine kleine Anmerkung: Im Internet ist zu finden, dass F13 bis F24 durch F1 bis F12 zusammen mit Shift (Umschalttaste) auch auf Standardtastaturen genutzt werden können. Doch das scheint wenig verbreitet zu sein. Vor der Recherche für diesen Artikel war mir dieser Workaround unbekannt und auf meinem Rechner funktioniert er auch nicht bzw. erkennt AutoHotkey die Tastenkombinationen Shift+(F1-F12) nicht als F13-F24.
Die Tastenbelegung
Mausbewegung
F13 bis F20 bilden die acht Richtungen ab, in die sich der Mauscursor bewegen können soll, also oben, unten, links, rechts und die Diagonalen. Auf der Tastatur sind diese Belegungen ringförmig angeordnet, die Taste in der Mitte bleibt unbelegt.
In der AutoHotkey-Dokumentation (https://www.autohotkey.com/docs/v1/lib/MouseMove.htm) finden sich die Parameter für die Mausbewegung:
MouseMove, X, Y [, Speed, Relative]
Den Parameter Speed setze ich nicht, weil es mir bei einer Distanz von nur einem Pixel nicht darauf ankommt, wie schnell sich der Mauscursor bewegt. X und Y geben in Verbindung mit einem R für relative Bewegung die Anzahl Pixel an, um die der Mauscursor verschoben werden soll. Wichtig ist hier, dass sich der Koordinatenursprung des Bildschirms oben links befindet. F13 als exemplarisch herausgegriffenes Beispiel soll den Mauscursor nach oben links bewegen, muss demnach sowohl in X- als auch in Y-Richtung jeweils 1 abziehen. Analog werden die Deltas für die anderen Tasten festgelegt.
Eine Zeile definiert zunächst den jeweiligen Hotkey. Ein führender Stern dient als Wildcard für die Modifier-Tasten (z.B. Strg, Shift, Alt) und sorgt dafür, dass der Hotkey auch dann erkannt wird, falls währenddessen eine oder mehrere der Modifier-Tasten gedrückt sind. Das bildet die Funktion der echten Maus nach, die sich beim Verschieben oder Klicken ja auch nicht für die aktuell gedrückten Modifier interessiert.
Nach dem doppelten Doppelpunkt folgt die auszuführende Aktion. Da es sich nur um eine einzelne Aktion handelt, passt sie in dieselbe Zeile. AutoHotkey ermöglicht auch mehrzeilige Anweisungsblöcke, ein solcher ist hier aber nicht notwendig.
Insgesamt ergibt sich für F13 die folgende Zeile:
*F13::MouseMove, -1, -1,, R
Klicks
F21 bis F24 sind unter dem Ring platziert und für die Mausklicks vorgesehen (Rechts, Mitte, Links und Doppelklick links). Für Dreifachklicks werden die Belegungen für einen Doppel- und einen Einfachklick direkt nacheinander abgeschickt, für Vierfachklicks entsprechend zwei Doppelklicks. Das Scrollen mit dem Mausrad wird nicht simuliert.
Für Klicks stehen einige Parameter mehr zur Verfügung als für Mausbewegungen (aus https://www.autohotkey.com/docs/v1/lib/MouseClick.htm):
MouseClick [, WhichButton, X, Y, ClickCount, Speed, DownOrUp, Relative]
Der Mauscursor befindet sich glücklicherweise schon da, wo er gebraucht wird. Die Zielkoordinaten und bewegungsrelevanten Parameter können deshalb entfallen, und da ein vollständiger Klick inklusive des Loslassens der Taste beabsichtigt ist, bleibt auch DownOrUp leer. Nur, um welche Taste es überhaupt geht, und gegebenenfalls die Anzahl der Klicks, muss noch konkretisiert werden:
*F21::MouseClick, Left,,, 2
Skript
Das folgende Skript übersetzt die Funktionstasten in Mausbewegungen bzw. Klicks. Es kann z.B. als Maus.ahk gespeichert und dann per Doppelklick gestartet werden:
; Umbelegungen für F-Tasten auf Zusatztastatur ; Pixelverschiebungen *F13::MouseMove, -1, -1,, R *F14::MouseMove, 0, -1,, R *F15::MouseMove, 1, -1,, R *F16::MouseMove, -1, 0,, R *F17::MouseMove, 1, 0,, R *F18::MouseMove, -1, 1,, R *F19::MouseMove, 0, 1,, R *F20::MouseMove, 1, 1,, R ; Tasten F21-F24 für Maustasten umbelegen *F21::MouseClick, Left,,, 2 *F22::MouseClick, Left *F23::MouseClick, Middle *F24::MouseClick, Right
Mögliche Weiterentwicklungen
- Einsparung von Funktionstasten: Es wäre möglich, AutoHotkey anstelle aller 12 Funktionstasten auf nur eine davon reagieren zu lassen, die als Startmarker interpretiert wird, nach dem z.B. ein numerischer Code für die auszuführende Aktion erwartet wird. Die anderen Funktionstasten würden so für sonstige Zwecke frei bleiben.
- Schrittweises Drag&Drop: Ein Drag&Drop ohne die Maustaste tatsächlich gedrückt halten zu müssen, wäre möglich, wenn eine Funktionstaste als separates MouseDown bzw. MouseUp interpretiert würde. Die oben zitierte Doku für MouseClick serviert diese Möglichkeit mit dem Parameter DownOrUp praktisch auf dem Silbertablett.
Andere Anwendungszwecke
AutoHotkey bietet vielfältige Möglichkeiten zur Automatisierung wiederkehrender Aufgaben oder zur Anpassung der Eingabegeräte an eigene Wünsche. Außerdem können für einen Hotkey, abhängig vom gerade aktiven Fenster, unterschiedliche Aktionen hinterlegt werden, was eine Hardware allein nicht zu leisten imstande wäre, weil sie keinen Zugriff auf die grafische Benutzeroberfläche hat.
Eine Makrotastatur ermöglicht es auch, neben der Bereitstellung vollständig fehlender Tasten, bereits vorhandene Tasten für bestimmte Anwendungszwecke sinnvoller zu gruppieren.
Beide Optionen sind grundsätzlich dazu geeignet, häufig wiederkehrende Floskeln (z.B. Begrüßungen/Verabschiedungen), Mailadressen oder Formatierungs- und andere Tags stets abrufbar zu halten, ohne die Gefahr von Tippfehlern einzugehen oder den Inhalt der Zwischenablage zu überschreiben. Welche der Optionen ich im jeweiligen Fall vorziehe, hängt von der Häufigkeit ab, mit der ich sie nutze. Wichtige Tags, die anfällig fürs Vertippen sind, landen in der Makrotastatur, die meisten anderen Strings im Skript.
Einschränkungen bezüglich des betriebssystemseitig konfigurierten Tastaturlayouts
- Da das Tastaturlayout immer für alle angeschlossenen Tastaturen gilt und von ihm die verfügbaren Zeichen abhängen, können Zeichen, die nicht im gewählten Tastaturlayout vorgesehen sind, nicht mittels einer Makrotastatur eingegeben werden. Allerdings könnte hier wieder die Kombination mit einer Skriptsprache eine Lösung ermöglichen.
- Auch der Wechsel zu einem anderen Tastaturlayout nach der Konfiguration der Makrotastatur kann bewirken, dass die auf den Tasten hinterlegten Zeichen anders als gewünscht (oder überhaupt nicht mehr) erkannt werden.
Fazit
Eine Makrotastatur sendet fest vorgegebene Tastensequenzen an den Rechner, kann aber nicht auf das reagieren, was dieser gerade tut. Außerdem ist die Länge der Sequenz meist beschränkt.
Eine Skriptsprache kann grundsätzlich alles tun, wozu auch ein anderes Programm in der Lage wäre. Allerdings muss ein Skript tatsächlich gestartet werden, um seine Aufgabe zu erfüllen, und die dafür nutzbaren Tastenkombinationen sind mit zunehmender Anzahl immer schwerer zu merken.
Die Kombination einer Makrotastatur mit einer Skriptsprache vereinigt das Beste aus zwei Welten: Mit nur einem Tastendruck auf eine eindeutig beschriftete Taste können beliebig komplexe Funktionalitäten ausgelöst werden.
Mit dieser Lösung für das zwar nicht gravierende, aber bisweilen ziemlich zeitraubende Problem des springenden Mauscursors, endet unsere kleine „How to“-Reihe.
How to: Wie man mit Folding und Syntaxhighlighting Notizen in Notepad++ übersichtlicher machen kann
How to: Wie man am Laptop fehlende Tasten mit Makrotastatur oder AutoHotkey nachbilden kann
Softwareentwicklung