Hallo,
es ist schon mal erstaunlich, dass der Systemhook überhaupt in einer Exe funktioniert. Normalerweise funktioniert das nur in einer DLL. Das lässt einen tiefen Einblick darauf zu,
was der VB-Compiler da eigentlich zusammenwurstelt.
PostMessage vertragen nicht alle Programme.
Desweiteren gibt es sicher Programme die einen KeyDown plus KeyUp als eindeutiges Indiz für
die Betätigung des Keyboards am PC angeschlossen auswerten, bzw. den Keyup überhaupt nicht
auswerten. Das Tool, das diese Action ausführt sollte meiner Meinung nach Prüfen ob KeyDown
zum Erfolg führte und wenn nicht dann KeyUP. Dein Beispielscode macht es sich da ziemlich einfach.
Eine Möglichkeit der Lösung wäre aber mal zunächst, das asynchrone PostMessage durch SendMessage auszutauschen.
' Tastatureingabe auswerten
Public Function LowLevelKeyboardProc(ByVal nCode As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Static kbDllhs As KBDLLHOOKSTRUCT
Dim blnKeyBlocked As Boolean
Dim test As Long
If nCode = HC_ACTION Then
Call CopyMemory(kbDllhs, ByVal lParam, Len(kbDllhs))
blnKeyBlocked = False
' key down
If kbDllhs.flags = 0 Then
' virtueller Tastencode = 110 (Komma)
If kbDllhs.vkCode = 110 Then
' Nachricht an aktives Fenster schicken
' (Tastatureingabe, keydown) hat auch mit
' Senkeys funktioniert (ist aber meiner
' Meinung nach nicht so toll)
SendMessage GetControl, WM_KEYDOWN, ByVal VK_OEM_PERIOD, 0&
'ursprüngliche Tastatureingabe nicht weitergeben
LowLevelKeyboardProc = 1
Else
'ursprüngliche Tastatureingabe weitergeben
LowLevelKeyboardProc = CallNextHookEx(kbHookRet, nCode, wParam, _
lParam)
End If
End If
' key up
If kbDllhs.flags = 128 Then
' virtueller Tastencode = 110 (komma)
If kbDllhs.vkCode = 110 Then
' Nachricht an aktives Fenster schicken
' (Tastatureingabe, keyup) hat auch mit
' Senkeys funktioniert (ist aber meiner
' Meinung nach nicht so toll)
'Anmerkung von Jochen Wierum (JoWi@ActiveVB.de):
' Ich habe die Zeile deaktiviert, da sonst bei einem
' Tastendruck immer 2 Punkte erzeugt wurden. Falls es
' in dieser Konfiguration Probleme geben sollte, bitte
' den Kommentar vor der folgenden Zeile entfernen:
'PostMessage GetControl, WM_KEYUP, ByVal VK_OEM_PERIOD, 0&
'ursprüngliche Tastatureingabe nicht weitergeben
LowLevelKeyboardProc = 1
Else
'ursprüngliche Tastatureingabe weitergeben
LowLevelKeyboardProc = CallNextHookEx(kbHookRet, nCode, wParam, _
lParam)
End If
End If
End If
End Function |