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

 

В простейшем случае функция должна содержать следующий код:

Code:

function KeyboardProc(Code: Integer; wParam: WPARAM;

lParam: LPARAM): Integer; stdcall;

begin

if Code < 0 then

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

end;

 

 HookHandle это глобальная переменная, которая должна содержать идентификатор ловушки, полученный от SetWindowsHookEx. Для установки ловушки напишем функцию:

Code:

function SetHook(Activate : BOOL): BOOL; stdcall; export;

begin

Result := FALSE;

if Activate then

begin

   HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc,

     hInstance, 0);

   Result := (HookHandle <> 0);

end

else

begin

   if HookHandle <> 0 then

   begin

     Result := UnhookWindowsHookEx(HookHandle);

     if Result then

       HookHandle := 0;

   end;

end;

end;

 

 Здесь возникает первая сложность. Для корректной обработки событий в каждом из процессов DLL загружается в адресное пространство всех процессов в системе. Если объявить HookHandle как глобальную переменную внутри DLL, то когда эта DLL будет загружена в адресное пространство разных процессов в каждом из них она будет иметь свой набор глобальных переменных. Таким образом, в вызывающем процессе HookHandle будет равен идентификатору ловушки, а в остальных нулю. Необходимо организовать доступ к этой переменной из всех процессов. Лучше всего использовать механизм отображения файлов на память (memory mapped files). Он заключается в том, что можно установить соответствие между каким-либо участком адресного пространства и участком в файле на диске. При этом, все изменения, сделанные в памяти отображаются на файл. Более того, если несколько процессов отобразили свою память на один и тот же участок файла изменения, сделанные любым из них немедленно становятся доступными остальным т.е. этот участок памяти становится общим для всех этих процессов. Такой общий блок переменных удобно создавать прямо в swap-файле Windows.

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

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

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

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


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