Взаимодействие процессов
Архитектура Win32 подразумевает максимальную изоляцию выполняющихся приложений друг от друга. Каждое приложение выполняется в своем виртуальном адресном пространстве, которое полностью обособлено и не имеет доступа к памяти других программ. Однако иногда возникает необходимость в передаче данных их одного выполняющегося процесса в другой. Рассмотрим подробно одну из таких задач, а затем основные способы связи между процессами и рекомендации по их применению.
Пишем перехватчик клавиатуры
Итак, стоит задача – перехватить события от клавиатуры во всех выполняющихся процессах. Для перехвата событий Win32 API предоставляет механизм, называемый «ловушками» (hook). Ловушка может быть установлена на многие события, возникающие в Windows, такие, как события от мыши, создание окон, вызов оконной процедуры и т.п. Для её установки используется функция:
function SetWindowsHookEx(
idHook: Integer; // Идентификатор, показывающий какая
// ловушка устанавливается
lpfn: TFNHookProc; // Адрес функции-ловушки
hmod: HINST; // Идентификатор модуля, в котором находится
// процедура-ловушка
dwThreadId: DWORD // Идентификатор потока, для которого ловушка
// устанавливается
): HHOOK; stdcall; // Функция возвращает идентификатор ловушки.
Рассмотрим эти параметры подробнее:
IdHook Целое число, инструктирующее Windows какое событие должно вызывать срабатывание «ловушки». Должно быть одной из констант, WH_XXX, описанных в Windows.pas. Нас интересует WH_KEYBOARD
lpFn Адрес функции, которая будет автоматически вызываться каждый раз при возникновении события.
hMod Идентификатор модуля, в котором расположена функция. Если ловушка устанавливается на события, происходящие в других процессах (а не только в вызывающем), то функция lpfn должна находиться в DLL. Эта DLL загружается в адресное пространство каждого процесса Windows. Если ловушка ставится только на события, происходящие в вызывающем процессе, то функция может находиться прямо в EXE файле, а в качестве этого параметра передается 0.
dwThreadId Идентификатор потока, события в котором нас интересуют. Если этот параметр равен 0, то ловушка ставится на все потоки в системе.
Поскольку нам нужны события во всех потоках – необходимо написать DLL, содержащую функцию-ловушку. В эту же DLL удобно поместить функцию для включения и отключения ловушки.
Функция-ловушка для WH_KEYBOARD должна соответствовать прототипу:
function KeyboardProc(
Code: Integer; // Определяет способ обработки события
// если Code < 0, функция должна немедленно
// вызвать CallNextHookEx и возвратить
// её результат
wParam: WPARAM; // Содержит код клавиши
lParam: LPARAM // Содержит набор битовых флагов с дополнительной
// информацией
): Integer; // Функция должна вернуть 0 для разрешения Windows
// дальнейшей обработки события или другое число
// для её запрета
stdcall; // Функция должна соответствовать соглашению о
// вызовах stdcall
- Назад
- Вперёд >>
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!