| Da es mit reinen Visual Basic-Mitteln nicht möglich ist, einen systemweiten Hook zu setzen, wollen wir in unserem Beispiel der Status jeder Taste in bestimmten zeitlichen Abständen überprüfen. Zu diesem Zweck stellt das Windows-API die Funktionen GetAsyncKeyState und GetKeyState bereit. Diese Funktionen werden über einen Zeitgeber, dessen Intervall auf eine Millisekunde eingestellt ist, aufgerufen. Zwischen den beiden Funktionen gibt es Unterschiede, so gibt GetAsyncKeyState sowohl den Status der Taste als auch Informationen darüber zurück, ob sich der Tastenstatus seit dem letzten Aufruf der Funktion für die Taste verändert hat. Folgendes Listing zeigt die Deklarationen der Funktionen GetAsyncKeyState und GetKeyState. Über die Konstante VK_CAPITAL kann ermittelt werden, ob ein Gross- oder Kleinbuchstabe vorliegt: Private Declare Function GetKeyState Lib "user32.dll" ( _
ByVal nVirtKey As Long _
) As Integer
Private Declare Function GetAsyncKeyState Lib "user32.dll" ( _
ByVal vKey As Long _
) As Integer
Private Const VK_MENU As Long = &H12&
Private Const VK_SHIFT As Long = &H10&
Private Const VK_CONTROL As Long = &H11&
Private Const VK_CAPITAL As Long = &H14&
Listing 1: Deklarationen der verwendeten Funktionen. Will man lediglich prüfen, ob gerade eine Taste gedrückt ist, wobei es irrelevant ist, ob sich seit der letzten Überprüfung der Status der Taste geändert hat, dann muss nur überprüft werden, ob das höchstwertige Bit (MSB, Test mit „Verunden“ mit -32.768) gesetzt ist: If CBool(GetAsyncKeyState(VK_MENU) And &H8000) Then
Call MsgBox("Die Alt-Taste ist gedrückt.")
Else
Call MsgBox("Die Alt-Taste ist nicht gedrückt.")
End If Listing 2: Prüfen, ob eine Taste seit der letzten Überprüfung gedrückt wurde oder gedrückt ist. Bei einigen Projekten zur Tastaturüberwachung, die im Internet als Quellcode verfügbar sind, tritt das Problem auf, dass beim initialisieren des Aufzeichnungsvorhangs, also wenn die oben genannten Funktionen für eine Taste zum ersten Mal aufgerufen werden, ermittelt wird, dass diese gedrückt ist, obwohl dies nicht der Fall ist. Dies liegt daran, dass der Tastaturpuffer vor dem ersten Durchlauf der Tasten nicht leer ist. Damit die Anwendung korrekt funktioniert, muss zuerst der Status jeder Taste abgefragt und erst danach mit der Aufzeichnung begonnen werden. Wenn die Taste gedrückt ist, ist das höchstwertige Bit des Rückgabewertes gesetzt: If CBool(GetAsyncKeyState(VK_MENU) And &H1) Then
Call MsgBox("Die Alt-Taste ist gedrückt.")
Else
Call MsgBox("Die Alt-Taste ist nicht gedrückt.")
End If Listing 3: Prüfen, ob eine Taste gedrückt ist. Bei jedem Feuern des Timer-Steuerelements wird für alle interessanten Tasten eine solche Überprüfung vorgenommen. Bei einigen Tasten ist es für das Protokoll interessant zu wissen, ob die Hochstelltaste gedrückt ist, um zwischen Gross- und Kleinbuchstaben zu unterscheiden. Im Parameter von GetAsyncKeyState muss für die Taste der virtuelle Tastencode (engl.: „virtual key code“) übergeben werden. Dazu kann man entweder eine der VK_*-Konstanten benutzen oder die Visual Basic-eigenen vbKey*-Konstanten angeben. Bei der Anfertigung eines Tastaturprotokolls im Textformat ist zu beachten, dass sprachspezifische Sonderzeichen (Tasten), beispielsweise „ä“, im Code gesondert behandelt werden müssen. Weiters können für Funktionstasten eigene beschreibende Texte für das Protokoll angegeben werden. |