VB-Tec.de Visual Basic - Technik, FAQ, Tricks, BeispieleHome / System / Maus u. Kbd. / Key Tastatur abfragen |
Im guten alten QuickBasic (für DOS!) gibt es die sogenannte Inkey$-Funktion, welche es erlaubt, die Tastatur abzufragen, ohne auf irgendwelche Ereignisse/Events zurückgreifen zu müssen. In VB gibt es eine solche Funktion leider nicht, daher ist eine Tastaturabfrage ohne Formular normalerweise nicht möglich.
Nachfolgend werden zwei Funktionen realisiert (natürlich mit API-Hilfe), welche eine ähnliche Funktionalität wie unter QuickBasic bieten.
Im folgenden Beispiel wird bei gedrückter Strg-Taste kurz gepiept und dann auf das Loslassen der Strg-Taste gewartet. Steht dieser Code z.B. in Form_Load, so wird die Anzeige des Formulars so lange verzögert, wie die Strg-Taste gedrückt wird...
If KeyPressed(vbKeyControl) Then 'Strg wird gerade gedrückt... Beep 'Aktion durchführen... ;-) 'Auf Loslassen warten: KeyPressed vbKeyControl, True End If
Hier wird der Status von vier Tasten gleichzeitig geprüft:
If Inkey(True) Like "*J*O*ST*" Then 'Die Tasten "J", "O", "S" und "T" wurden gleich- 'zeitig gedrückt und wieder losgelassen... Beep 'Aktion durchführen... ;-) End If
Im Deklarationsteil eines Moduls muss folgende API-Funktion bekannt gemacht werden:
Private Declare Function GetAsyncKeyState Lib "user32" ( _
ByVal vKey As Long) As Integer
Die KeyPressed-Funktion benutzt die obige API-Funktion, um den aktuellen Status der Taste Key abzufragen. Da uns nur interessiert, ob die Taste gerade im Moment gedrückt wird, muss das höchstwertige Bit &H8000 geprüft werden. Wird der optionale Wait-Parameter auf True gesetzt, so wartet die Funktion bis zum Loslassen der Taste (analog zum VB-Befehl SendKeys).
Public Function KeyPressed( _
ByVal Key As KeyCodeConstants, _
Optional ByVal Wait As Boolean = False _
) As Boolean
'Status feststellen:
KeyPressed = CBool(GetAsyncKeyState(Key) And &H8000)
'Ggf. auf Loslassen warten:
Wait = Wait And KeyPressed
If Wait Then
Do While CBool(GetAsyncKeyState(Key) And &H8000)
Loop
End If
End Function
Die Inkey-Funktion arbeitet ähnlich wie die KeyPressed-Funktion, gibt jedoch einen String aller gerade gedrückten Tasten zurück (in der Reihenfolge des Codes, also z.B. "A" vor "B"). Wird der optionale Wait-Parameter auf True gesetzt, so wartet die Funktion bis zum Loslassen aller Tasten.
Public Function Inkey( _
Optional ByVal Wait As Boolean = False _
) As String
Dim Key As Long
'Tastatur-Codes sammeln:
For Key = 1 To 255
If CBool(GetAsyncKeyState(Key) And &H8000) Then _
Inkey = Inkey & Chr$(Key)
Next Key
'Ggf. auf Loslassen warten:
Wait = Wait And CBool(Len(Inkey))
Do While Wait
Wait = False
For Key = 1 To 255
If CBool(GetAsyncKeyState(Key) And &H8000) Then _
Wait = True
Next Key
Loop
End Function
© Jost Schwider, 03.08.2001-03.08.2001 - http://vb-tec.de/inkey.htm