Kontakt
DSVGO
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