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

 

а по завершении:

Code:

if Assigned(CommonArea) then

UnmapViewOfFile(CommonArea);

if hMapping <> 0 then

CloseHandle(Mapping);

 

 Удобно оформить этот код в виде отдельного модуля, поместив создание и уничтожение объекта, соответственно в его секции initialization и finalization, которые автоматически выполняются при загрузке модуля в память и выгрузке его из памяти. Назвав этот модуль Exchange, и поместив его в список используемых модулей основной программы и DLL, мы автоматически получим в них глобальную переменную CommonArea, указывающую на разделяемую память.

Внимание! Если Вы используете такой модуль в разных проектах, то каждый из них должен содержать свою копию этого модуля с различными значениями UniqueHookId

Имея этот модуль, мы можем переписать функции KeyboardProc и SetHook

Code:

function KeyboardProc(Code: Integer; wParam: WPARAM;

lParam: LPARAM): Integer; stdcall;

begin

if Code < 0 then

   Result := CallNextHookEx(CommonArea^.HookHandle,

     Code, wParam, lParam );

end;

 

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

Code:

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

begin

Result := FALSE;

if Activate then

begin

   CommonArea^.HookHandle := SetWindowsHookEx(WH_KEYBOARD,

     @KeyboardProc, hInstance, 0);

   Result := (CommonArea^.HookHandle <> 0);

end

else

begin

   if CommonArea^.HookHandle <> 0 then

   begin

     Result := UnhookWindowsHookEx(CommonArea^.HookHandle);

     if Result then

       CommonArea^.HookHandle := 0;

   end;

end;

end;

 

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

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

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

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


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