Tipp 0155 Tastatur
Autor/Einsender:
Datum:
  Alexander Csadek
09.01.2007
Entwicklungsumgebung: VB.Net 2003
DirectX-Version:   DirectX 9
Den Tastaturstatus mittels DirectInput auszulesen ist denkbar einfach. Dazu muss lediglich ein DirectInput-Device mit SystemGuid.Keyboard erzeugt und die CooperativeLevelFlags gesetzt werden. Die CooperativeLevelFlags sind wichtig, damit DirectInput darüber informiert wird, wie die jeweilige Anwendung mit der Tastatur interagieren möchte und wie es sich die Tastatur mit anderen Anwendungen oder dem Betriebssystem selbst teilen soll. Dazu kommen wir später noch.
Zunächst wird jedoch zuerst ein DirectInput-Device für die Tastatur benötigt.
 
Dim gDIDevice As Device = Nothing
gDIDevice = New Device(SystemGuid.Keyboard)
 
Die folgenden CooperativeLevelFlags geben an, ob eine Anwendung exklusiven Zugriff auf die Tastatur erhält.
 
CooperativeLevelFlags.Exclusive
CooperativeLevelFlags.NonExclusive
 
Ein exklusiver Zugriff ist jedoch nicht immer möglich. Ist bereits eine andere Anwendung aktiv,  die bereits einen exklusiven Zugriff auf die Tastatur hat, dann ist kein weiterer exklusiver Zugriff möglich.
Die folgenden Flags bestimmen, ob die Anwendung die Tastaturinformationen nur dann bekommen soll wenn es im Vordergrund ist, also den Fokus hat.
 
CooperativeLevelFlags.Foreground
CooperativeLevelFlags.Background
 
Wird der Flag für den Hintergrund (Background) gesetzt, bekommt die Anwendung zu jeder Zeit den Tastaturstatus. Auch wenn eure Anwendung nicht im Vordergrund ist, also den Fokus hat.
Der nächste Flag legt fest, ob mit den Windows-Tasten auf der Tastatur die TaskBar angezeigt wird, oder ob dies unterdrückt wird.
 
CooperativeLevelFlags.NoWindowsKey
 
Das Deaktivieren der Windows-Tasten geht nur, wenn die Anwendung im Vordergrund ist, also den Fokus hat, und auf die Tastatur nicht exklusiv zugreift.
 
Dim myCoopLevelFlags As CooperativeLevelFlags
myCoopLevelFlags = CooperativeLevelFlags.NonExclusive or _
      CooperativeLevelFlags.Foreground
gDIDevice.SetCooperativeLevel(Me, myCoopLevelFlags)
 
Jetzt muss nur noch die Verbindung zur Tastatur hergestellt werden. Dies geschieht mit der Methode Acquire des Device-Objekts, mit der Methode Unacquire wird die Verbindung wieder getrennt.
Wichtig: Wird der Device im Speicher mittels Dispose freigegeben, muss die Methode Unacquire aufgerufen werden, andernfalls wird ein Fehler (Exception) erzeugt.
Ist der Device eingerichtet, und die Verbindung zur Tastatur besteht, können die Daten ausgelesen werden. Dafür gibt es zwei Möglichkeiten, die Daten sofort auslesen (Immediate) oder mittels eines Buffers (Buffered).
Zum sofortigen (Immediate) Auslesen der Daten wird die KeyboardState Collection benötigt, die.den Status aller Tasten, ob gedrückt oder nicht gedrückt, enthält.
 
Dim myKeyboardState As KeyboardState = Nothing
myKeyboardState = gDIDevice.GetCurrentKeyboardState()
Dim myKey As Key
For myKey = Key.Escape To Key.MediaSelect
  If myKeyboardState(myKey) Then
    myText &= myKey.ToString() & " "
  End If
Next myKey
 
Das sofortige Auslesen der Daten berücksichtigt natürlich nicht die Informationen zwischen zwei Abfragen. Diese Informationen sind verloren.
Beim gepufferten (buffered) Auslesen der Daten muss dem Device mitgeteilt werden, wie groß der Puffer sein soll.
 
gDIDevice.Properties.BufferSize = 8
 
Zum Auslesen des Buffers gibt es die BufferedDataCollection. Hierbei ist jedoch zu beachten, dass bei einem Puffer-Überlauf, alle Informationen verloren sind.
 
Dim myDataCollection As BufferedDataCollection = Nothing
myDataCollection = gDIDevice.GetBufferedData()
Dim myBD As BufferedData
For Each myBD In myDataCollection
  'Ausgeben des Tasten-Hex-Wertes plus
  ' D für gedrückt (down)
  ' U für nicht gedrückt (up)
  myText += [String].Format("0x{0:X}", myBD.Offset)
  myText += IIf(0 <> (myBD.Data And &H80), "D ", "U ")
Next
 
Hinweis
Um diesen Tipp ausführen zu können, wird die DirectX 9 for Managed Code Runtime benötigt.

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (11,4 kB) Downloads bisher: [ 302 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

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

Seite empfehlen Bug-Report
Letzte Aktualisierung: Freitag, 20. Januar 2012