Tastatureingaben abfangen
von Jochen Wiehrum
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
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.