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

 

Взаимодействие процессов

Архитектура 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

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

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

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

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


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