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

 

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

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

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

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

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

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


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