KeyBuddy2 - Dokumentation

von Mirko Kunze mirko.kunze(a)web.de

KeyBuddy2 ist ein Programm zur Umsetzung des neo-Layouts. Außerdem bietet es die Möglichkeit, kyrillische Zeichen einzugeben und Hotstrings zu definieren, wobei während des Tippens Zeichenketten ersetzt oder Programme gestartet werden können. KeyBuddy2 ist Freeware und kostet lediglich einen würdigenden Gedanken an den Autor.

KeyBuddy2 benutzen

Einfach KeyBuddy2.exe ausführen. Im selben Ordner müssen folgende Dateien liegen: hotstrings.txt, keynames.txt, mousemap.txt, neomap.txt, rumap.txt, sendmap.txt, symbolmap.txt, uppercase.txt
Eine Tastatur öffnet sich, die Anzeigt, was passiert, wenn man eine Taste drückt. Im Groben verhält sich die Tastatur wie hier www.neo-layout.org beschrieben. Es gibt jedoch folgende Erweiterungen: Folgende Aspekte von neo wurden nicht umgesetzt:

KeyBuddy2 konfigurieren

Über die diversen Textdateien bietet KeyBuddy2 viele Konfigurationsmöglichkeiten. Zu ihrer bearbeitung empfiehlt sich Notepad++ mit unifont als Schriftart, sowie ein Hex-Editor. Alle Textdateien müssen mit einem Zeilenumbruch enden.

Hotstrings

In hotstrings.txt werden die Hotstrings definiert, die KeyBuddy2 erkennen soll. Diese Datei muss im Format UCS-2 Little Endian vorliegen (In Notepad++ unter Kodierung einstellbar). Die Datei muss mit einem Zeilenumbruch enden.
Ein Hotstring lässt sich wie folgt definieren:
h="hs" s="Hotstring"
Sobald man nun hs eingibt, wird zweimal die Löschtaste und anschließend das wort "Hotstring" gesendet. Die verschiedenen Hotstrings müssen durch Zeilenumbrüche getrennt sein. Statt des Sendens einer Zeichenkette kann auch ein beliebiges Programm gestartet werden. Beispiel:
h="calc" l="calc.exe"
Tippt man calc, wird es wieder gelöscht und der Taschenrechner gestartet. Der Arbeitsordner des Programms und weitere Kommandozeilenparameter lassen sich wie folgt definieren:
h="wineula" l="c:/windows/system32|notepad.exe|eula.txt"
Es lassen sich auch Filter definieren:
t="Notepad++"
Der Hotstring feuert nur, wenn im Titel des Fensters, das den Fokus hat, die Zeichenkette "Notepad++" zu finden ist.
c="Scintilla"
Dieser Hotstring feuert nur, wenn die Klasse des Objekts, das den Fokus hat, den Namen "Scintilla" trägt.
Die Reihenfolge, in der die Parameter eines Hotstrings aufgelistet werden, ist beliebig. Hauptsache ist, dass sie durch ein Leerzeichen getrennt sind und in der gleichen Zeile stehen. Zeilenumbrüche innerhalb der Anführungszeichen sind erlaubt und werden als zur Zeichenkette gehörend interpretiert. Das Maskierungszeichen ist \. Das bedeutet, dass Anführungszeichen innerhalb einer Zeichenkette durch \" und Backslashes selbst durch \\ realisiert werden können. Spezielle Tastendrücke, die sich nicht durch Unicode darstellen lassen, sowie Tastenkombinationen, können wie im nächsten Kapitel dargestellt codiert werden.

neo-Remapping

Die Datei neomap.txt (ANSI) dient dazu, den Virtual-Key Code der gedrückten Taste auf den der entsprechenden neo-Taste zu ändern. Der Key-Code der gedrückten Taste entspricht hierbei der Zeilennummer (beginnend bei 1) und der ANSI-Code des Zeichens in einer Zeile entspricht dem neo-Key-Code. In Zeile 68 sollte also ein A stehen, da die reale D-Taste (vk=68) der neo-A-Taste (vk=65) entspricht. Leere Zeilen bedeuten, dass hier kein Mapping stattfinden soll.
Folgende Tasten lassen sich umdefinieren: A..Z, 0..9, Punkt, Komma, Bindestrich, Zirkumflex (^), Akut (´), Plus, Tab und die Leertaste.

Allgemeines Layout

Das allgemeine Layout lässt sich in sendmap.txt (UCS-2 Little Endian) editieren. Die Zeilennummer eines Zeichens beschreibt den neo-Key-Code der Taste, die für dieses Zeichen gedrückt werden soll. Die Spalte eines Zeichens in seiner Zeile beschreibt die Ebene, die aktiv sein muss, damit das Zeichen gesendet wird. Pro Zeile müssen also sieben Zeichen definiert sein, Spalte sieben ist für die Pseudo-Ebene.
In der Basic Multilingual Plane des Unicode (U+0000 bis U+FFFF) gibt es die so genannte Private Use Area (U+E000 bis U+F8FF), die für selbstdefinierte Zeichen nutzbar ist. In KeyBuddy2 wird sie dazu verwendet, spezielle Tastenkombinationen zu senden. Normalerweise nutzt KeyBuddy2 die SendInput-Funktion der Windows API mit dem Flag KEYEVENTF_UNICODE, um Unicode-Zeichen an Programme zu senden. Damit lassen sich jedoch nicht alle Tasten simulieren (Cursor-Tasten, F1 bis F12, ...). Liegt das erste Byte eines zu sendenden Zeichens zwischen 0xE0 und 0xF7, wird kein Unicode-Zeichen gesendet, sondern ein Tastendruck simuliert (ebenfalls über SendInput). Hierbei beschreibt das zweite Byte den Virtual-Key Code der zu simulierenden Taste. Das erste Byte erlaubt noch weitere Konfigurationsmöglichkeiten, die in der folgenden Tabelle dargestellt werden.

UnicodeShiftStrgAltrunterhochechte Taste wird runtergedrücktechte Taste wird losgelassen
U+E0xx X xx↓
U+E1xxX X Shift↓ xx↓
U+E2xx X X Strg↓ xx↓
U+E3xxXX X Strg↓ Shift↓ xx↓
U+E4xx XX Alt↓ xx↓
U+E5xxX XX Shift↓ Alt↓ xx↓
U+E6xx XXX Strg↓ Alt↓ xx↓
U+E7xxXXXX Strg↓ Shift↓ Alt↓ xx↓
U+E8xx Xxx↑
U+E9xxX Xxx↑ Shift↑
U+EAxx X Xxx↑ Strg↑
U+EBxxXX Xxx↑ Strg↑ Shift↑
U+ECxx X Xxx↑ Alt↑
U+EDxxX X Xxx↑ Shift↑ Alt↑
U+EExx XX Xxx↑ Strg↑ Alt↑
U+EFxxXXX Xxx↑ Strg↑ Shift↑ Alt↑
U+F0xx XXxx↓xx↑
U+F1xxX XXShift↓ xx↓xx↑ Shift↑
U+F2xx X XXStrg↓ xx↓xx↑ Strg↑
U+F3xxXX XXStrg↓ Shift↓ xx↓xx↑ Strg↑ Shift↑
U+F4xx XXXAlt↓ xx↓xx↑ Alt↑
U+F5xxX XXXShift↓ Alt↓ xx↓xx↑ Shift↑ Alt↑
U+F6xx XXXXStrg↓ Alt↓ xx↓xx↑ Strg↑ Alt↑
U+F7xxXXXXXStrg↓ Shift↓ Alt↓ xx↓xx↑ Strg↑ Shift↑ Alt↑

Über U+F8xx lassen sich die Tasten mit Umschaltern belegen:

U+F800 = KeyBuddy2 schließen
U+F801 = KeyBuddy2 aktivieren/deaktivieren
U+F802 = neo-Layout/qwertz-Layout
U+F803 = Kyrillisch an/aus
U+F804 = Capslock an/aus (geht auch über LShift+RShift)
U+F805 = Ebene 4 lock/unlock (geht auch über <+AltGr)
U+F806 = Maussteuerung an/aus
U+F807 = GUI öffnen/schließen (geht auch über Linksklick auf Tray-Icon)

Die Datei symbolmap.txt ist genauso aufgebaut wie sendmap.txt, allerdings enthält sie nicht die Zeichen, die gesendet werden sollen sondern was auf der Tastatur in der GUI abgebildet wird.

Das Editieren dieser Spezialkombinationen dürfte sich in einem Texteditor als schwierig erweisen, weswegen ein Hex-Editor empfohlen wird. Hierbei muss beachtet werden, dass U+ABCD im Little-Endian-Format als CDAB erscheint.

Kyrillisches Layout

Das Layout für kyrillische Buchstaben ist in rumap.txt (UCS-2 Little Endian) definiert. Hierbei wird der Unicode des sonst zu sendenden Zeichens (wieder definiert durch Zeilennummer, muss zwischen 1 und 255 liegen) auf ein kyrillisches Symbol abgebildet. Es lässt sich (genau) ein Dead-Key (standardmäßig J) definieren. In seiner Zeile muss ein Kreuz (Unicode 0x2020) stehen. Definiert man in einer Zeile zwei kyrillische Symbole, lässt sich das zweite via Dead-Key erreichen.

Maussteuerung

Die Maussteuerung ist in der Datei mousemap.txt (ANSI) definierbar. Hierbei werden die Virtual-Key Codes (nicht neo-Key-Codes!) für Mausaktionen in folgender Reihenfolge aufgelistet:

Nach links bewegen
Nach oben bewegen
Nach rechts bewegen
Nach unten bewegen
Linksklick
Rechtsklick
Mittelklick
Scrollrad hoch
Scrollrad runter

Restliche Textdateien

Die Datei keynames.txt enthält die Namen der Tasten bei deaktiviertem Remapping, uppercase.txt enthält das Mapping von Kleinbuchstaben-Unicode auf Großbuchstaben-Unicode, was bei Capslock benutzt wird.

Der Quellcode

KeyBuddy2 wurde mit Ultimate++ Version 4193 geschrieben und mit MinGW (finde keine Versionsnummer) kompiliert.

Main Class

Die Programmklasse heißt KeyBuddy2 und findet sich in KeyBuddy2.h bzw. main.cpp. Beim Starten des Programms wird ihr Konstruktor aufgerufen, beim Beenden ihr Destruktor.

ProcessKbdEvent

Dies ist die Kernfunktion des Programms, sie findet sich in main.cpp. Sie wird aufgerufen, sobald ein (echtes oder simuliertes) Tastaturereignis (Runterdrücken oder Loslassen einer Taste, wobei eine reale, gehaltene Taste ständig "Runterdrücken"-Signale sendet) passiert. Wenn sie true zurückliefert, wird das Ereignis weitergeleitet, bei false wird es blockiert. Folgendes tut sie: Zwischendrin wird noch unter diversen Umständen die GUI neu gezeichnet.

SendUNIKey

Im Falle des Sendens eines Unicode-Zeichens wird SendInput mit dwFlags=KEYEVENTF_UNICODE aufgerufen. Im Falle einer speziellen Tastenkombination (U+E000 .. U+F8FF) wird zunächst ermittelt, ob Strg, Shift oder Alt mitgesendet werden sollen. Anschließend wird der aktuelle Tastaturzustand über GetKeyboardState ausgelesen und in keyboardStateBuffer zwischengespeichert. Danach werden virtuell alle Tasten losgelassen. Die Tastenkombination wird mit SendInput gesendet und die Tastatur wird wieder in ihren ursprünglichen Zustand versetzt.

Der Rest

Alle weiteren Funktionen sind hoffentlich ausreichend im Quelltext dokumentiert.

Viel Spaß!

Mirko Kunze