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