среда, 1 сентября 2010 г.

Перехват событий Windows

Для перехвата событий в Windows, предусмотрена API-функция SetWindowsHookEx. С помощью нее можно перехватить как события отдельной нити, так и глобальные события Windows. Функция SetWindowsHookExA имеет следующую сигнатуру:
HHOOK WINAPI SetWindowsHookEx(
__in int idHook,
__in HOOKPROC lpfn,
__in HINSTANCE hMod,
__in DWORD dwThreadId
);

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

Для того чтобы перехватить событие текущей нити, достаточно определить функцию, соответствующую сигнатуре HOOKPROC и вызвать функцию SetWindowsHookEx, как приведено в примере ниже:
LRESULT CALLBACK hook_proc(int code, WPARAM wParam,
LPARAM lParam)
{
MessageBoxA(NULL, "Key Pressed", "Key Pressed", MB_OK);
return CallNextHookEx(NULL, code, wParam, lParam);
}

//Где-то в программе {
HHOOK hHook = SetWindowsHookExA(WH_KEYBOARD, hook_proc, NULL,
GetCurrentThreadId());
if (hHook == NULL)
{
DWORD err = GetLastError();
char chr[20];
itoa(err, chr, 10);
MessageBoxA(hWnd, chr, "Error", MB_OK | MB_ICONERROR);
}
else
{
MessageBoxA(hWnd, chr, "Keyboard Evend Hooked!",
MB_OK | MB_ICONERROR);
}
//}
Исходный код приведенного примера лежит тут.

Перехват глобального события требует создания DLL с функцией-обработчиком события. Подробно о создании DLL написано здесь.
Исходный код примера можно загрузить по этой ссылке.

Комментариев нет:

Отправить комментарий