Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

8.3 Пример работы с dll

Рассмотрим работу с DLL на примере создания ловушки для перехвата нажатых клавиш

Рассмотрим использование ловушек для перехвата нажатых клавиш.

8.3.1 Создание dll, которая выполняет перехват нажатых клавиш

Последовательность разработки DLL:

  1. Создайте новый проект (File-New-DLL). Присвойте разрабатываемой DLL имя «Sendkey».

  2. Запишите в DLL следующий программный код:

library SendKey;

uses Sysutils, Classes, Windows, Messages;

const

//пользовательские сообщения

wm_LeftShow_Event=wm_User + 133;

wm_RightShow_Event=wm_User + 134;

wm_UpShow_Event=wm_User +135;

wm_DownShow_Event=wm_User +136;

wm_Other_Event=wm_User +137;

var

SaveExitProc: Pointer;

// handle для ловушки

HookHandle: hHook = 0;

// собственно ловушка

function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;

stdcall; export;

var

H:HWND;

begin

{если Code >= 0, то ловушка может обработать событие}

if (Code >= 0) and (lParam and $40000000 = 0) then

begin

//ищем окно приложения, которому DLL будет передавать сведения.

// Приложение ищется по имени класса и по заголовку

// Caption формы управляющей программы, который должен быть равен

//'XXX' !!!!

H:=FindWindow('TForm1', 'XXX');

// это те клавиши, которые отслеживаются?

case wParam of

VK_Left: SendMessage(H,wm_LeftShow_Event, 0, 0);

VK_Right: SendMessage(H,wm_RightShow_Event, 0, 0);

VK_Up: SendMessage(H,wm_UpShow_Event, 0, 0);

VK_Down: SendMessage(H,wm_DownShow_Event, 0, 0);

else SendMessage(H,wm_Other_Event, 0, wParam);

end;

// если 0, то система должна дальше обработать это событие, если 1 - нет

Result:=0;

end

else

if Code < 0

then { если Code < 0, то нужно вызвать следующую ловушку }

Result := CallNextHookEx(HookHandle, Code, wParam, lParam);

end;

// при выгрузке DLL надо снять ловушку

procedure LocalExitProc; far;

begin

if HookHandle <> 0 then

begin

UnhookWindowsHookEx(HookHandle);

ExitProc:=SaveExitProc;

end;

end;

exports Key_Hook;

// инициализация DLL при загрузке ее в память

begin

//Создание ловушки, перехватывающей события клавиатуры

HookHandle:=SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);

if HookHandle = 0 then

MessageBox(0, 'Unable to set hook!', 'Error', mb_Ok)

else

begin

SaveExitProc := ExitProc;

ExitProc := @LocalExitProc;

end;

end.

  1. Откомпилируйте DLL

8.3.2 Разработка приложения, которое выполняет анализ и обработку нажатых клавиш.

  1. Создайте проект (New Application), изображенный на рисунке 8.3).

  1. Установите у объекта Form1 свойство Caption равным «ХХХ». Это необходимо потому, что DLL необходимо знать имя окна, которому передаются сообщения с помощью функции SendMessage.

  2. Перенесите на форму компоненты, указанные в таблице 8.1.

Таблица 8.1 Визуальные компоненты приложения

Компонент

Класс

Описание

1

Label1

TLabel

Для вывода на экран кода очередной нажатой клавиши

2

Button1

TButton

Кнопка «Выход»

  1. Проверьте, включены ли в проект (в блоке uses) следующие библиотеки:

uses

WinTypes,WinProcs, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

  1. В блоке const опишите пользовательские сообщения:

Const

{ пользовательские сообщения }

wm_LeftShow_Event=wm_User + 133; {Клавиша влево}

wm_RightShow_Event=wm_User + 134; {Клавиша вправо}

wm_UpShow_Event=wm_User + 135; {Клавиша вверх}

wm_DownShow_Event=wm_User + 136; {Клавиша вниз}

wm_Other_Event=wm_User + 137; {Все остальные клавиши}

  1. В блоке private выполните предварительное описание процедур обработки нажатых клавиш:

private

procedure WM_LeftMSG(Var M: TMessage); message wm_LeftShow_Event;

procedure WM_RightMSG(Var M: TMessage); message wm_RightShow_Event;

procedure WM_UpMSG(Var M: TMessage); message wm_UpShow_Event;

procedure WM_DownMSG(Var M: TMessage); message wm_DownShow_Event;

procedure WM_OtherMSG(Var M: TMessage); message wm_Other_Event;

end;

  1. В блоке Var определите глобальную переменную P – указатель на функцию из DLL (Key_Hook)

var

Form1: TForm1;

P:Pointer;

  1. В блоке implementation выполните загрузку DLL:

implementation

{$R *.DFM}

// Загрузка DLL

function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;

stdcall; external 'SendKey.dll' name 'Key_Hook';

  1. Выполните описание процедур:

procedure TForm1.WM_LeftMSG(Var M: TMessage);

begin

Label1.Caption := 'Left';

end;

procedure TForm1.WM_RightMSG(Var M: TMessage);

begin

Label1.Caption := 'Right';

end;

procedure TForm1.WM_UpMSG(Var M: TMessage);

begin

Label1.Caption := 'Up';

end;

procedure TForm1.WM_DownMSG (Var M : TMessage);

begin

Label1.Caption := 'Down';

end;

procedure TForm1.WM_OtherMSG(Var M: TMessage);

begin

Label1.Caption :=chr(M.LParam);

end;

  1. Для компонента Form1 запрограммируйте событие OnCreate следующим образом:

procedure TForm1.FormCreate(Sender: TObject);

begin

{ если не использовать вызов процедуры из DLL в программе, то компилятор удалит загрузку DLL из программы }

P:=@Key_Hook;

end;

  1. Откомпилируйте приложение и проверьте его работу.