Шаг 152 - Hooks (перехват)

Понятие перехвата используется во многих областях. Например, даже при создании диалогового окна открытия файла мы может установить перехват подробнее читайте "Шаг 140 - Cтруктура OPENFILENAME". Перехват является точкой в обработка сообщений Microsoft Windows, где приложение может установить подпрограмму, чтобы проверить трафик сообщения в системе и обработать определенные тип сообщений прежде, чем они достигнут процедуры окна в которую посланы. Перехваты имеют тенденцию замедлять систему из-за того, что они увеличивают суммарное время обработки, которую система должна выполнить для каждого сообщения. У нас есть утилита SPY подробнее читайте "Шаг 47 - Как пользоваться SPY", которая умеет следить за сообщениями Windows для конкретного окна. Разработчики использующие MFC имеют еще одну дополнительную утилиту MFC Tracer, читайте "Шаг 44 - Знакомимся с MFC Tracer", "Шаг 227 - afxTraceFlags", которая позволяет следить за сообщениями. Можно воспользоваться и сторонними утилитами, которые в основном нацелены на слежение за пользователями читайте "Шаг 139 - Программа слежения WinGuard".

А можно создать ее и самому. Вы должны устанавливать захват только когда необходимо, и удалять его как можно скорее. Для установки захвата используется функция.

HHOOK SetWindowsHookEx
(
	int idHook,	// тип перехвата
	HOOKPROC lpfn,	// процедура перехвата
	HINSTANCE hMod,	// указатель приложения
	DWORD dwThreadId	// идентифкатор потока
); 

А для отмены перехвата UnhookWindowsHookEx. Ну попробуем, что ли. MFC приложение Dialog Bases:

152_1.gif (5262 b)

Заводим глобальную переменную:

static char THIS_FILE[] = __FILE__;
#endif

HHOOK hk;

/////////////////////////////////////
// CAboutDlg dialog used for App About

А теперь процедуру обработки, запуск и остановка перехвата:

LRESULT  CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	MessageBox(NULL,"Hook","Hook",MB_OK);
	return CallNextHookEx(hk, nCode, wParam, lParam);
}

void CHookDlg::OnStart() 
{
	hk = SetWindowsHookEx(WH_KEYBOARD,&HookProc, NULL, 0);
}

void CHookDlg::OnStop() 
{
	UnhookWindowsHookEx(hk);	
}

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

152_2.gif (4552 b)

Полный пример есть в проекте.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 06.11.2001