Понятие перехвата используется во многих областях. Например, даже при создании диалогового окна открытия файла мы может установить перехват подробнее читайте "Шаг 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:
Заводим глобальную переменную:
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 попытался нажать клавишу:
Полный пример есть в проекте.