а по завершении:
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; |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!