Seite 1 von 1

Problem mit Keyboard-Hook

Verfasst: 08.02.2012 04:27
von Sunny
Ich hab hier mal einen kleinen Code-Schnipsel:

Code: Alles auswählen

Procedure.s Keylog()
  For i = 5 To 255
    
    If GetAsyncKeyState_(i)
      Debug i
      
      While GetAsyncKeyState_(i)
        Delay(50)
      Wend
      
    EndIf
    
  Next
  
EndProcedure


Repeat
  
  Delay(50)
  
  Keylog()
  
Until GetAsyncKeyState_(27)

End
Nun Folgendes:
Wenn ich jetzt z.B. die Strg - Taste drücke, dann müssten mir eigentlich jedes mal die Werte 17 und 162 ausgegeben werden (17 beim drücken der Taste und 162 beim loslassen). Nun ja, manchmal passiert das auch, aber manchmal wird nur der Wert 17 zurückgegeben und die 162 bleibt beim loslassen der Taste einfach aus. Woran könnte das liegen?

Re: Problem mit Keyboard-Hook

Verfasst: 08.02.2012 05:37
von c4s
Das ist kein richtiger Keyboard-Hook. GetAsyncKeyState_() ist zudem bekannt dafür, dass gelegentlich Events verschluckt werden können. Ich empfehle eher etwas in Richtung folgendem zu verwenden:

Code: Alles auswählen

SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), [...]
...Näheres sollte die Such-Funktion liefern.

Re: Problem mit Keyboard-Hook

Verfasst: 08.02.2012 07:26
von Nino
Folgendes funktioniert hier prima (PB 4.60, Windows XP 32 Bit):

Code: Alles auswählen

Define prevState.i, state.i

Repeat
   Delay(50)
   state = (GetAsyncKeyState_(#VK_CONTROL) <> 0) Or #False
   If prevState <> state
      Debug state
      prevState = state
   EndIf
Until GetAsyncKeyState_(#VK_ESCAPE)
Aber ich meine auch, dass GetAsyncKeyState_() für einen allgemeinen Keylogger nicht gut geeignet ist. Und ein "Hook" ist's eh nicht.

Grüße, Nino

Re: Problem mit Keyboard-Hook

Verfasst: 09.02.2012 17:00
von Thorium
Ein Hook ist das wirklich nicht, verschluckt wird allerdings auch nichts, man muss nur den Rückgabewert richtig auswerten, siehe dazu MSDN. Der Rückgabewert beinhaltet 2 Informationen. Ob die Taste gedrückt ist und ob sie seid dem letzen Aufruf gedrückt wurde. Wie man das auswertet siehe MSDN.