Visual Basic - Technik, FAQ, Tricks, Beispiele

Home / System / Maus u. Kbd. / Key

Tastatur abfragen

Einleitung

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.

Beispiele

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

Code / Quelltext

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