Пример использования:
Code: |
var Form1: TForm1; WndFlag: HWND; // дескриптор последнего окна keys: string[41]; // нажатые клавишы hDLL: THandle; // дескриптор загружаемой библиотеки WM_MYKEYHOOK: Cardinal; // мо? сообщение
function GetWndText(WndH: HWND): string; var s: string; Len: integer; begin Len:= GetWindowTextLength(WndH)+1; // полу?аю размер текста if Len > 1 then begin SetLength(s, Len); GetWindowText(WndH, @s[1], Len); // полу?аю сам текст, который записывается в s Result:= s; end else Result:= 'text not detected'; end;
procedure TForm1.Button1Click(Sender: TObject); var Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall; begin {посылаю своему окну сообщение для того ?то бы не выводился первый символ - см. WndProc} SendMessage(Form1.Handle, WM_MYKEYHOOK, VK_SPACE, Application.MainForm.Handle); @hook:= nil; // инициализируем переменную hook hDLL:=LoadLibrary(PChar('keyhook.dll')); { загрузка DLL } if hDLL > HINSTANCE_ERROR then begin { если вс? без ошибок, то } @hook:=GetProcAddress(Hdll, 'hook'); { полу?аем указатель на необходимую процедуру} Button2.Enabled:=True; Button1.Enabled:=False; StatusBar1.SimpleText:= 'Status: DLL loaded...'; hook(true, Form1.Handle); StatusBar1.SimpleText:= 'Status: loging in progress...'; end else begin ShowMessage('Ошибка при загрузке DLL !'); Exit; end;
end;
procedure TForm1.Button2Click(Sender: TObject); var Hook: procedure (switch : Boolean; hMainProg: HWND) stdcall; begin @hook:= nil; // инициализируем переменную hook if hDLL > HINSTANCE_ERROR then begin { если вс? без ошибок, то } @hook:=GetProcAddress(Hdll, 'hook'); { полу?аем указатель на необходимую процедуру} Button1.Enabled:=True; Button2.Enabled:=False; hook(false, Form1.Handle); if FreeLibrary(hDLL) then begin StatusBar1.SimpleText:= 'Status: DLL unloaded.'; sleep(1000) end else begin StatusBar1.SimpleText:= 'Status: ERROR while unloading DLL'; Exit; end; StatusBar1.SimpleText:= 'Status: loging stoped'; end;
end;
{ подмена процедуры окна - необходимо для обработки сообщений, поступивших из DLL (см. исходный код DLL) } procedure TForm1.WndProc(var Msg: TMessage); begin inherited ; // выполняем вс? то, ?то должно происходить при поступлении сообщеня окну {Но если пришло мо? сообщение - выполняем следующий код} if Msg.Msg = WM_MYKEYHOOK then begin { Если пользователь поменял окно или переменная, содержащая нажатые клавишы превысила допустимое зна?ение - обнуляем keys и выводим статистику. } if (WndFlag <> HWND(Msg.lParam)) OR (Length(keys)>=1) then begin keys:=keys+String(Chr(Msg.wParam)); memo2.Text:=memo2.Text+' '+inttostr(ord(Chr(Msg.wParam))); //label1.caption:=label1.caption+keys; keys:=''; Memo1.Lines.Add(GetWndText(Msg.lParam)); WndFlag:= HWND(Msg.lParam) end else keys:=keys+String(Chr(Msg.wParam)); end; end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin freelibrary(hDLL); end;
initialization WndFlag:=0; keys:= ''; { регистрирую сво? сообщение в системе - то?но так же надо сделать и в теле DLL ?то бы DLL могла посылать главному приложению это сообщение. } WM_MYKEYHOOK:=RegisterWindowMessage('WM_MYKEYHOOK'); end. |
- << Назад
- Вперёд
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!