Использование Ловушек


Установить ловушку можно при помощи функции SetWindowsHookEx, указав при этом: 1) тип ловушки; 2) диапазон её действия: на всю систему (глобальная ловушка) или только на текущий поток (локальная); 3) указатель на точку входа в процедуру.

Если ловушка будет глобальной, то её процедуру необходимо разместить в динамически загружаемой библиотеке (DLL). Поэтому, перед тем, как установить глобальную ловушку, приложению понадобится дескриптор модуля DLL. Чтобы получить дескриптор модуля DLL, необходимо воспользоваться функцией LoadLibrary с именем DLL. После того, как дескриптор будет получен, можно воспользоваться функцией GetProcAddress, чтобы получить указатель на точку входа в процедуру ловушки. В заключение, вызывается SetWindowsHookEx, чтобы прописать адрес процедуры ловушки в цепочке ловушек. Описанная последовательно выглядит следующим образом:

HOOKPROC hkprcSysMsg; 
static HINSTANCE hinstDLL;
static HHOOK hhookSysMsg;

hinstDLL = LoadLibrary((LPCTSTR) "c:\\windows\\sysmsg.dll");
hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");
hhookSysMsg = SetWindowsHookEx(WH_SYSMSGFILTER,hkprcSysMsg,hinstDLL,0);

Удалить локальную ловушку (удалить её адрес из цепочки ловушек) можно функцией UnhookWindowsHookEx, указав ей дескриптор удаляемой процедуры ловушки.

Глобальную ловушку можно тоже удалить функцией UnhookWindowsHookEx, однако она не освобождает DLL, содержащую процедуру ловушки. Причина заключается в том, что глобальная ловушка вызывается в контексте процесса для каждого приложения, делая неявный вызов функции LoadLibrary для всех этих процессов. Так как использовать функцию FreeLibrary для другого процесса невозможно, то освободить DLL не получится. Это не страшно, так как система автоматически освобождает DLL, после того, как все процессы, связанные с DLL, завершатся либо будет вызвана FreeLibrary и все процессы, которые вызывают процедуру ловушки продолжат обработку за пределами DLL.

Альтернативный способ установки глобальной ловушки заключается в том, чтобы поместить функцию установки ловушки в DLL вместе с процедурой ловушки. При таком подходе, приложению, которое устанавливает ловушку не нужно получать дескриптор модуля DLL. Связавшись с DLL, приложение получает доступ к функции инталяции. Функция инсталяции может легко получить дескриптор модуля DLL, а так же другие значения, необходимые для вызова функции SetWindowsHookEx. DLL так же может функцию, которая удаляет процедуру глобальной ловушки; а приложение может вызывать эту функцию при завершении своей работы.

Отслеживание системных событий

Следующий пример показывает как использовать различные локальные ловушки, для того, чтобы отслеживать при помощи каких событий система взаимодействует с текущим потоком. В примере используются следующие типы ловушек:

  • WH_CALLWNDPROC
  • WH_CBT
  • WH_DEBUG
  • WH_GETMESSAGE
  • WH_KEYBOARD
  • WH_MOUSE
  • WH_MSGFILTER

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

 
« Предыдущая статья   Следующая статья »