Tastatur-Nachrichten

Genauso wenig wie es unter WINDOWS eine Funktion namens printf(...) gibt um Texte auszugeben, genauso wenig gibt es eine sscanf(...) oder getch(...) Funktion zum Einlesen von der Tastatur. Statt dessen sendet WINDOWS bis zu fünf(!) Nachrichten, in der Regel immer an das aktive Fenster, wenn eine Taste gedrückt wird. Sehen wir uns diese Nachrichten nun an.

Wird eine 'normale' Taste gedrückt bzw. wieder losgelassen, so sendet WINDOWS eine WM_KEYDOWN bzw. WM_KEYUP Nachricht. Für die Bearbeitung dieser Nachrichten stellt die MFC die CWnd-Methoden OnKeyDown(...) bzw. OnKeyUp(...) bereit. Der erste Parameter dieser Methoden enthält den virtuellen Tastencode der gedrückten Taste. Der virtuelle Tastencode gibt nur die Taste an, die gedrückt wurde und entspricht nicht unbedingt dem ASCII-Code der Taste. So besitzen z.B. die Zeichen 'A' und 'a' den gleichen virtuellen Tastencode. Die nachfolgende Aufstellung ist ein Auszug aus der Datei WINUSER.H und enthält einige der wichtigsten virtuellen Tastencodes:

Virtuelle Taste

Tastatur-Taste

VK_BACK Backspace Taste
VK_RETURN Return (Enter) Taste
VK_ESCAPE Escape Taste
VK_LEFT, VK_RIGHT,
VK_UP, VK_DOWN
Cursor Tasten
VK_SNAPSHOT Druck Taste
'0' ... '9' Tasten 0 ... 9
'A' ... 'Z' Tasten A ... Z
VK_F1 ... VK_F12 Funktionstasten F1 ... F12

Der zweite Parameter gibt die Anzahl der von der Tastatur gesendeten Zeichen an. Dieser Parameter besitzt in der Regel den Wert 1. Nur bei gedrückt gehaltener Taste enthält dieser Parameter einen Wert größer 1. Der letzte Parameter enthält u.a. noch den Scan-Code der gedrückten Taste.

Wird eine Systemtaste (beliebige Taste in Kombination mit der ALT-Taste) gedrückt oder losgelassen, so wird anstelle einer WM_KEYDOWN bzw. WM_KEYUP Nachricht die Nachricht WM_SYSKEYDOWN bzw. WM_SYSKEYUP gesendet. Die Nachrichtenbearbeiter innerhalb der MFC heißen dem entsprechend OnSysKeyDown(...) bzw. OnSysKeyUp(...). Die Bedeutungen der Parameter der Methoden entsprechen denen der Methoden OnKeyXxxx(...).

Waren die bisherigen Nachrichten nur Tastennachrichten, so wenden wir uns jetzt den Zeichen selbst zu. In den Down- bzw. Up-Nachrichten wird nur der virtuelle Tastencode übertragen, nicht aber der ASCII-Code wie z.B. 0x61 für das kleine 'a'. Wissen Sie noch wie aus dem virtuellen Tastencode der Zeichencode wird? Diese Umkodierung erfolgt durch den Aufruf der API-Funktion TranslateMessage(...) (siehe dazu im Kapitel 2, Lektion Die Nachrichtenschleife). TranslateMessage(...) übersetzt eine entsprechende Down-Nachricht in eine WM_CHAR Nachricht wenn die gedrückte Taste eine ASCII-Taste ist. Für die Bearbeitung dieser Nachricht stellt die Klasse CWnd den Nachrichtenbearbeiter OnChar(...) zur Verfügung. Die letzten beiden Parameter der Methode entsprechen in ihrer Bedeutung den gleichnamigen Parametern in den bisherigen Tastaturnachrichten. Lediglich der erste Parameter hat eine andere Bedeutung. Er enthält jetzt den ASCII-Code der gedrückten Taste.

Sehen wir uns einmal an welche Nachrichten auftreten wenn Sie den Großbuchstaben 'A' eingeben:

Nachricht

Auslöser

WM_KEYDOWN SHIFT-Taste wird gedrückt.
WM_KEYDOWN virtuelle Taste 'a' wird gedrückt.
WM_CHAR Nachricht mit dem ASCII-Code für 'A'.
WM_KEYUP virtuelle Taste 'a' wird losgelassen.
WM_KEYUP SHIFT-Taste wird losgelassen.

Wurde eine Systemtaste gedrückt, so wird über die API-Funktion TranslateMessage(...) eine WM_SYSCHAR Nachricht ausgelöst. Der CWnd Nachrichtenbearbeiter hierfür heißt folglich auch OnSysChar(...).

Sehen wir uns einmal an welche Nachrichten auftreten wenn Sie ALT-A eingeben:

Nachricht

Auslöser

WM_SYSKEYDOWN ALT-Taste wird gedrückt.
WM_SYSKEYDOWN virtuelle Taste 'a' wird gedrückt.
WM_SYSCHAR Nachricht mit dem ASCII-Code für 'A'.
WM_SYSKEYUP virtuelle Taste 'a' wird losgelassen.
WM_KEYUP ALT-Taste wird losgelassen.

Beachten Sie bitte, dass das Loslassen der ALT-Taste eine normale WM_KEYUP Nachricht erzeugt.

Damit sind wir fast am Ende dieser kurzen Lektion angelangt. Einen Sonderfall haben wir noch nicht behandelt, die so genannten 'toten Tasten'. 'Tote Tasten' sind Tasten die für sich alleine genommen keine Ausgabe erzeugen. Zu den 'toten Tasten' gehören auf der deutschen Tastatur die Akzente (links neben der Backspace-Taste und links neben der 1-Taste). Diese Tasten erzeugen eigene Nachrichten, für die die MFC auch entsprechende Bearbeiter OnDeadChar(...) und OnSysDeadChar(...) zur Verfügung stellt.

Auch zu dieser Lektion gibt es selbstverständlich ein kleines Beispielprogramm das Sie unter 06Eingaben\KeybMsg finden. Auf eine Beschreibung des Programms soll hier verzichtet werden da es von seiner Struktur recht einfach aufgebaut ist. Das Programm stellt alle Tasteneingaben in dekodierter Form innerhalb eines Fensters dar. Die Betonung liegt hier aber eindeutig auf ALLE! Sie können das Fenster z.B. nicht mehr mit ALT-F4 schließen und auch der Wechsel zu einer anderen Applikation mit ALT-TAB funktioniert nicht. Also aufpassen wenn Sie Eingaben abfangen!

In der nächsten Lektion erfahren Sie zum Schluss dieses Kapitels noch etwas über den Eingabe-Cursor.



Copyright © 2004

Senden Sie Emails mit Fragen oder Kommentaren zu dieser Website an: mailto:info@cpp-tutor.de
 Wolfgang Schröder, Lerchenweg 23, D-72805 Lichtenstein. Tel: +49 7129 6470