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
|
|
|
|
Um diesen Tipp ausführen zu können, wird die DirectX 9 for Managed Code Runtime benötigt.
|
|