Tastaturabfragen


Tastaturabfragen können auf die unterschiedlichste Art und Weise erfolgen, es kommt halt ganz darauf an was man machen möchte - oder muß. Für die meisten Fälle reicht die INKEY$ Funktion völlig aus und unter Umständen ist selbst das INPUT noch recht nützlich. Es gibt eigentlich nur zwei Spezialfälle die immer wieder auftreten und einem Kopfzerbrechen bereiten.

Beim ersten Problem handelt es sich um eine von vielen schmerzlich vermisste Eingaberoutine die eine Eingabezeile von der Tastatur einliest. Naja, der INPUT Befehl macht das auch - aber mehr als dürftig. Die Eingabe sollte wenn möglich Begrenzt werden können und alle Tasten wie z.B. für das Markieren nötig unterstützen. Eine solche Routine gibt es tatsächlich. Sie heißt EditLine und wurde von Pawel Kazakow entwickelt. Es ist die wohl komplexeste Eingaberoutine die für QB existiert. Den Download findest Du aus seiner Homepage.

Das zweite Problem tritt meist dann auf, wenn man z.B. ein Spiel programmiert. Spätestens dann nämlich kommt man in die Verlegenheit mehr als nur eine Taste gleichzeitig abzufragen und da stösst QB an seine Grenzen.

Um dieses Problem zu umgehen habe ich lange Zeit im Internet nach einer vernünftigen und leicht zu nutzenden Lösung gesucht und sie schließlich auch gefunden - der Z-Keyboard Handler. Dabei handelt es sich um eine Assembler Routine welche sich bildlich gesprochen zwischen Tastatur und Betriebssystem einklinkt und Tastenbetätigungen "abfängt", bearbeitet und zum QB Programm weitergibt.

Ich habe die Original-Anleitung einmal ins deutsche übersetzt. Sie ist ebenfalls im Download enthalten. Download


DER Z-KEYBOARD HANDLER

Wie funktioniert's

Jedesmal, wenn Du eine Taste drückst, wird ein DOS Interrupt aufgerufen - der Interrupt 9. Der Z-Keyboard-Handler ändert die Interrupt-Vektor-Tabelle zu der Adresse wo sich die Routine des neuen Keyboard-Handlers befindet.
Das bedeutet, daß nach der Installation des neuen Handlers bei jedem Tastendruck die neue von uns geschriebene Assembler-Routine aufgerufen wird und nicht der Interrupt 9.

"auslesen" einer Taste

Immer, wenn eine Taste gedrückt wird, wird der Wert 1 in einem Array, mit dem Scancode der Taste als Offset, gespeichert.
Beispiel: Der Scancode für die Taste ESC ist 1. Wenn wir nun den Status der ESC-Taste prüfen wollen tun wir das mit folgender Zeile:

IF ZKey%(1) THEN PRINT "ESC ist gedrückt!"
'              ^der Scancode für ESC ist 1 (siehe weiter unten)

Bei allen anderen Tasten wird genauso verfahren. Die Scancodes der einzelnen Tasten findest Du weiter unten. Sollte das alles ein wenig zu verwirrend sein, dann schau Dir einfach unser Demo-Programm Z-KB-DEMO.BAS an.

Wozu das ganze!?!

Nun, wenn Du noch nie ein Spiel programmiert hast, dann wirst Du dich sicher fragen, wozu zum Geier einen neuen Keyboard-Handler installieren?
Der normale Zugriff auf Tasten erfolgt mit dem Befehl INKEY$. Dieser Befehl kann allerdings immer nur eine Taste abfragen, was es unmöglich macht z.B. einen Sprite zu kontrollieren. Abgesehen davon kommt es bei "wilden" Eingaben zu lästigen "Piepstönen", welche das Programm zum Anhalten bringen. All diese Probleme löst der Z-Keyboard-Handler.

Die Funktionen

SUB LoadAsm ()

Diese SUB lädt den Assembler-Code für den Handler in ein STRING-Array.
WICHTIG: Diese Funktion muss vor allen anderen aufgerufen werden!!!!!

SUB Zkbon ()

Aktiviert den neuen Keyboard-Handler. Gleichzeitig deaktiviert sie die QB-Abbruchfunktion CTRL-BREAK - also besser vorher mal abspeichern ;-)

SUB Zkboff ()

Deaktiviert den Keyboard-Handler wieder und aktiviert den alten.
WICHTIG: Diese Funktion muss aufgerufen werden bevor Dein Programm endet.

Die Scancodes

1 = ESC
2 = 1
3 = 2
4 = 3
5 = 4
6 = 5
7 = 6
8 = 7
9 = 9
10 = 0
11 = - oder _
12 = = oder +
13 = DEL
14 = TAB
15 = Q
17 = W
18 = E
19 = R
20 = T
21 = Y
22 = U
23 = I
24 = O
25 = P
26 = [ oder {
27 = ] oder }
28 = ENTER
29 = Strg 
30 = A
31 = S
32 = D
33 = F
34 = G
35 = H
36 = J
37 = K
38 = L
39 = ; oder :
40 = ' oder "
41 = \ oder ~
42 = Linke Shift
44 = Z
45 = X
46 = C
47 = V
48 = B
49 = N
50 = M
51 = , oder <
52 = . oder >
53 = / oder ?
54 = Rechte Shift
55 = * oder Druck 
56 = ALT
57 = Leertaste
58 = Caps Lock
59 = F1
60 = F2
61 = F3
62 = F4
63 = F5
64 = F6
65 = F7
66 = F8
67 = F9
68 = F10
69 = Num lock
70 = Rollen
71 = 7 oder Pos1
72 = 8 oder up
73 = 9 oder Bild hoch
74 = -
75 = 4 oder links
76 = 5
77 = 6 oder rechts
78 = +
79 = 1 oder Ende
80 = 2 oder runter
81 = 3 oder Bild runter
82 = 0 oder Einfg
83 = . oder Entf
87 = F11
88 = F12

Wow, eine ganze Menge Tasten was!
Nun wir hoffen, daß Du, wenn Du das Tool einsetzt, an uns denkst und uns in Deinen Spielen erwähnst.

Greg McAusland und Christopher Neill, Exposed Dreams '99 ins Deutsche von East-Power-Soft.