Die Community zu .NET und Classic VB.
Menü

Tastatureingaben abfangen

 von 

Grundlagen  

Zu erst ein wenig Theorie. Was wir auf jeden Fall benötigen, ist ein gültiges DirectX7 Objekt. Da dieses aber für alle DirectX Operationen gebraucht wird, und zwar nur einmal, schlage ich vor, dass wir es einfach in der Initialisierungsprozedur übergeben bekommen…

Daraus ergibt sich folgendes:

Function InitKeyboard(DirectXObject As DirectX7) _
 As Boolean

End Function

So weit so gut. Spätestens jetzt will DirectInput aber auch die hWnd des „Mutterfensters“ haben, also von dem Fenster, das meistens gebraucht wird (beispielsweise frmMain)

Nun können wir unsere Übergaben an die Sub vervollständigen:

Function InitKeyboard(DirectXObject As DirectX7, _
 hWnd As Long) As Boolean

End Function

Außerdem benötigen wir einige Objekte, die nur von DirectInput benötigt werden. Das ist zum Beispiel das DirectInput Objekt selbst. Außerdem brauchen wir die Tastatur, die ich hier Keyboard nenne. Also schreiben wir in den Deklarationsbereich folgendes:

Private DInput As DirectInput
Private Keyboard As DirectInputDevice

Jetzt können wir endlich unsere Initialisierungsfunktion schreiben:

Function InitKeyboard(DirectXObject As DirectX7, _
  hWnd As Long) As Boolean
 On Error Goto Fehler
    
  'Direct Input Objekt erstellen
 Set DInput = DirectXObject.DirectInputCreate()
    
  ' Keyboard auf Systemkeyboard setzen
 Set Keyboard = DInput.CreateDevice("GUID_SysKeyboard")

  ' Dataformat setzen
 Keyboard.SetCommonDataFormat DIFORMAT_KEYBOARD


  ' Cooperativelevel setzen
 Keyboard.SetCooperativeLevel hWnd, _
  DISCL_NONEXCLUSIVE Or DISCL_BACKGROUND

  'Verbinden
 Keyboard.Acquire

 InitKeyboard = True
 Exit Function
Fehler:
 InitKeyboard = False    
End Function

Oh je! So viel Neues auf einmal! Also: Zu erst wird das DirectInput Objekt erstellt, von dem aus dann das InputDevice Namens "Keyboard" erstellt wird. Außerdem wird beim Erstellen festgelegt, dass es sich um das Standard-System-Keyboard handelt… Anschließend wird Keyboard noch einmal mitgeteilt, dass es sich hier um eine Tastatur handelt und der CooperativeLevel gesetzt. Ich empfehle hier jedem, NONEXCLUSIVE zu verwenden, da sich Windows sonst ganz gerne bei bestimmten Aktionen gerne "verletzt" fühlt ;-)

Wenn alles glatt lief, sollte die Function jetzt True zurückgeben und ihr könnt das Keyboard abfragen… Wann immer ihr wollt!

Public Function GetPressedButtons() As DIKEYBOARDSTATE
 Keyboard.GetDeviceStateKeyboard GetPressedButtons
End Function

Der Code sagt alles, oder?
Abfragen kann man jetzt die Tasten mit:

If GetPressedButtons.Key(30) <> 0 Then
 MsgBox "Taste gedrückt"
End If

Jetzt wollt ihr sicher noch wissen, wie man die Verbindung wieder trennt! Ganz einfach:

Public Function DestroyKeyboard() As Boolean
 On Error Goto Fehler
 
 Set DInput = Nothing
 Set Keyboard = Nothing
 
 DestroyKeyboard = True
 Exit Function
Fehler:
 DestroyKeyboard = False
End Function

Alles klar? Dann sollten wir jetzt zur Übung ein Programm schreiben, dass die momentan gedrückten Tasten in Form ihrer Zahlen anzeigt. Das ist übrigens ein immer gut zu gebrauchendes Tool, wenn ihr mit DirectInput arbeitet!

Beispiel  

Zu erst erstellen wir ein neues Projekt und fügen unter Projekt|Komponenten die „DirectX7 Visual Basic Type Library“ hinzu. Dann schreiben wir in den Deklarationsbereich von Form1:

Dim Dx7 As DirectX7

Daraus ergeben sich nun folgende Zeilen in From_Load:

Private Sub Form_Load()
 Set Dx7 = New DirectX7
 InitKeyboard Dx7, Me.hWnd
End Sub

In Form_Unload schreiben wir folgendes:

Private Sub Form_Unload(Cancel As Integer)
 DestroyKeyboard
 Set Dx7 = Nothing
End Sub

Jetzt setzen wir in die Mitte des Forms eine Listbox und einen Timer. Der Timerinterval sollte 500 betragen.

Private Sub Timer1_Timer()
 Dim i As Integer
 Dim Keys As DIKEYBOARDSTATE

 keys = GetPressedButtons
 List1.Clear
 
 For i = 0 To 255
  If keys.Key(i) <> 0 Then List1.AddItem i
 Next i
End Sub

Jetzt müsst ihr nur noch das am Anfang erstellte Modul einfügen, speichern und starten!
Ich hoffe, das ich einen kleinen Einblick in DirectInput mit der Tastatur verschaffen konnte und wünsche euch noch viel Freude mit DirectX

Beispielprojekt zum Tutorial für DirectX7 

Beispielprojekt zum Tutorial für DirectX8 

Ihre Meinung  

Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.