DirectInput - Tastatur  

Nun aber endlich die Verwaltung von Eingabeinformationen, und als Erstes zu den Tastatureingaben. Diese sind recht einfach zu verwalten da ja jeder Computer über eine Tastatur verfügt und daher eine Auflistung der vorhandenen Eingabegeräte nicht notwendig ist. Dazu bietet DirectInput ein Standard-Datenformat an.

Es gibt drei Möglichkeiten um Tastatureingaben abzufragen:

  • über eine Schleife alle Tasten abfragen ob eine gedrückt wurde

  • in der Spielschleife nur die gewünschten Tasten abfragen ob sie gedrückt wurden

  • auf ein DirectXEvent warten und dann erst die gewünschten Tasten abfragen

Zunächst braucht man ein DirectInputDevice-Objekt, das über das DirectInput-Objekt und der Funktion CreateDevice() erstellt wird. Die Tastatur ist ein Systemeingabegerät und es kann die System-GUID der Tastatur "GUID_SysKeyboard" verwendet werden.

Set diDEV = DI.CreateDevice("GUID_SysKeyboard")

Mit dem nun erstellten DirectInputDevice-Objekt kann mit der Funktion SetCommonDataFormat() das Standarddatenformat (DIFORMAT_KEYBOARD) der Tastatur gesetzt werden.

diDEV.SetCommonDataFormat DIFORMAT_KEYBOARD

Nun muss nur noch der CooperativeLevel gesetzt werden, damit DirectInput weis wie es das Gerät mit anderen Anwendungen bzw. dem Windows zu teilen hat. Dies geschieht mittels der Funktion SetCooperativeLevel() vom DirectInputDevice-Objekt. Übergeben wird der Handle des Hauptfensters der Anwendung und der Flag für den CooperativeLevel. (siehe CooperativeLevel und Datenformat) 

diDEV.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or _
  DISCL_NONEXCLUSIVE

Jetzt muss das Eingabegerät, in unserem Fall die Tastatur, für unsere Anwendung reserviert werden. Hiefür wird die Funktion Acquire vom DirectInputDevice-Objekt verwendet.

diDEV.Acquire

Die Verbindung zur Tastatur steht und die Eingabeinformationen können verarbeitet werden. Zu beachten sei noch das die Tastatur immer den exakten Status liefert. Also ob ein oder mehrere Tasten gedrückt (ein) oder nicht gedrückt sind (aus). Diesen exakten Status erhält man über den Typ DIKEYBOARDSTATE und der Funktion GetDeviceStateKeyboard vom DirectInputDevice-Objekt.

Dim diState As DIKEYBOARDSTATE
diDEV.Acquire
diDEV.GetDeviceStateKeyboard diState

Die Abfrage der Tastatureingaben über eine Schleife ist die einfachste Möglichkeit. Es wird nur eine ForNext-Schleife über alle 256 Tasten benötigt. Diese Variante ist aber bei Spielen nicht sehr empfehlenswert, da immer alle Tasten überprüft werden obwohl vielleicht gar keine gedrückt wurde.

For iKeyCounter = 0 To 255
  If diState.Key(iKeyCounter) <> 0 Then
    lstKeys.AddItem iKeyCounter & " wurde gedrückt", 0
  End If
Next

Nur die gewünschten Tasten in der Spielschleife abzufragen ist auch recht einfach. Hat aber den gleichen Nachteil wie die Abfrage aller Tasten über eine Schleife. Es wird bei jedem Durchlauf auf Tastatureingaben geprüft obwohl vielleicht gar keine Informationen vorliegen.

If diState.Key(DIK_A) <> 0 Then
  'tu dies
Else
  'tu das
End If

Eine Möglichkeit, die die Ressourcen am Wenigsten beansprucht ist, auf ein DirectXEvent zu warten, um dann erst die gewünschten Tasten abzufragen, da die Tastatureingaben nur dann überprüft werden, wenn auch wirklich Informationen vorliegen. Hierbei muss aber ein DirectXEvent erstellt werden und die Prozedur DirectXEvent_DXCallback(ByVal eventid As Long) im Hauptfenster der Anwendung vorhanden sein.

Implements DirectXEvent
Dim DXEvent As Long

DXEvent = DirectX.CreateEvent(Me)
DDevice.SetEventNotification EventHandle

Private Sub DirectXEvent_DXCallback(ByVal eventid As Long)
  'Diese Prozedur wird automatisch von DirectX aufgerufen,
  'wenn etwas geändert wird.

 On Local Error Resume Next
 If
diDEV Is Nothing Then Exit Sub

 diDEV.GetDeviceStateKeyboard diState

  If Err.Number = DIERR_NOTACQUIRED Then diDEV.Acquire

End sub

Zu beachten ist hier auch noch, dass bei Verwendung von mehreren DXEvents (z.B. wenn Wave-Dateien gestreamt werden) die Event-ID abgefragt wird. Da ansonsten die Tastatureingaben überprüft werden obwohl gar kein Ereignis von DirectInput vorliegt.

Wird die Anwendung beendet, so sollten die Objekte und das Eingabegerät wieder freigegeben werden. Mit der Funktion Unacquire vom DirectInputDevice-Objekt wird das Eingabegerät wieder freigegeben. Das DirectInput-Objekt kann einfach auf Nothing gesetzt werden.

DirectX.DestroyEvent EventHandle
diDEV.Unacquire
Set DI = Nothing

Die gedrückte Taste abzufragen ist sehr einfach; wie Visual Basic bietet DirectInput ein komplettes Set von Konstanten um die Nummern der Tasten zu ersetzen. Entweder man benutzt die jeweiligen Konstanten (dadurch wird der Quellcode übersichtlicher) oder man fragt die Nummern der Tasten ab. Die nachfolgende Liste zeigt alle Konstanten. Diese Liste ist auch im Objekt-Browser von VB (F2-Taste drücken) unter der DirectX Library zu finden.

DIK_A
DIK_B
DIK_C
DIK_D
DIK_E
DIK_F
DIK_G
DIK_H
DIK_I
DIK_J
DIK_K
DIK_L
DIK_M
DIK_N
DIK_O
DIK_P
DIK_Q
DIK_R
DIK_S
DIK_T
DIK_U
DIK_V
DIK_W
DIK_X
DIK_Y
DIK_Z
DIK_1 
Auf der Haupttastatur
DIK_2  Auf der Haupttastatur
DIK_3  Auf der Haupttastatur
DIK_4  Auf der Haupttastatur
DIK_5  Auf der Haupttastatur
DIK_6  Auf der Haupttastatur
DIK_7  Auf der Haupttastatur
DIK_8  Auf der Haupttastatur
DIK_9  Auf der Haupttastatur
DIK_0  Auf der Haupttastatur
DIK_F1
DIK_F2
DIK_F3
DIK_F4
DIK_F5
DIK_F6
DIK_F7
DIK_F8
DIK_F9
DIK_F10
DIK_F11
DIK_F12
DIK_F13
DIK_F14
DIK_F15
DIK_NUMPAD0
DIK_NUMPAD1
DIK_NUMPAD2
DIK_NUMPAD3
DIK_NUMPAD4
DIK_NUMPAD5
DIK_NUMPAD6
DIK_NUMPAD7
DIK_NUMPAD8
DIK_NUMPAD9
DIK_ESCAPE
DIK_MINUS 
Auf der Haupttastatur
DIK_EQUALS  Auf der Haupttastatur
DIK_BACK  BackSpace
DIK_TAB
DIK_LBRACKET 
[
DIK_RBRACKET  ]
DIK_RETURN  Auf der Haupttastatur
DIK_LCONTROL  linke Strg-Taste
DIK_SEMICOLON
DIK_APOSTROPHE
DIK_GRAVE 
(`)
DIK_LSHIFT  linke Shift-Taste
DIK_BACKSLASH
DIK_COMMA
DIK_PERIOD 
Auf der Haupttastatur
DIK_SLASH Forward slash (/)Auf der Haupttastatur
DIK_RSHIFT  rechte Shift-Taste
DIK_MULTIPLY  * auf Nummernblock
DIK_LMENU  linke Alt-Taste
DIK_SPACE  Space-Taste
DIK_CAPITAL  Caps Lock
DIK_NUMLOCK
DIK_SCROLL
Scroll Lock
DIK_SUBTRACT  - auf Nummernblock
DIK_ADD  + auf Nummernblock
DIK_DECIMAL  . auf Nummernblock
DIK_NUMPADENTER
DIK_RCONTROL  rechte Strg-Taste
DIK_NUMPADCOMMA  Komma auf NEC PC98 Nummernblock
DIK_DIVIDE Forward slash (/)auf Nummernblock
DIK_SYSRQ
DIK_RMENU  rechte Alt-Taste
DIK_HOME
DIK_UP 
Pfeiltaste oben
DIK_PRIOR  Bild auf
DIK_LEFT  Pfeiltaste links
DIK_RIGHT Pfeiltaste rechts
DIK_END
DIK_DOWN
  Pfeiltaste unten
DIK_NEXT  Bild ab
DIK_INSERT
DIK_DELETE
DIK_LWIN 
linke Windows-Taste
DIK_RWIN  rechte Windows-Taste
DIK_APPS  Anwendungs-Taste
DIK_PAUSE

Ein Beispiel für die Verwaltung von Tastatureingaben können Sie hier downloaden.

  Download BitmapBlt.zip Download
tip0043.zip
 (13,1 kB)
Downloadzeit: <1 Min. - 28.8k / <1 Min. - ISDN Downloads bisher: [ 3107 ]

Startseite | VB-/VBA-Tipps | Projekte | Tutorials | API-Referenz | Komponenten | Bücherecke | Gewinnspiele | VB-/VBA-Forum | DirectX-Forum | VB.Net | .Net-Forum | Foren-Archiv | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report

Letzte Aktualisierung, Freitag, 03. Mai 2002