Листинг 3.12. Файл winhook/kbhook.cpp - часть 3
// Установка перехватчика на системную // очередь сообщений hhookMsg = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MsgHookProc, hInst, NULL);
// Включаем флаг установки перехватчиков bHooked = TRUE;
// Сохраняем идентификатор окна приложения, // установившего перехватчики hwndClient = hwnd; } }
// ======================================================== // Функция RemoveKbHook // Удаляет системные перехватчики // ========================================================
extern "C" void WINAPI _export RemoveKbHook(void) { // Если перехватчики были установлены, // удаляем их if(bHooked) { UnhookWindowsHookEx(hhookMsg); UnhookWindowsHookEx(hhook); } }
// ======================================================== // Функция KbHookProc // Перехватчик сообщений от клавиатуры // ========================================================
extern "C" LRESULT CALLBACK KbHookProc(int code, WPARAM wParam, LPARAM lParam) { // Проверка флага обработки сообщений. Если содержимое // параметра code меньше нуля, передаем сообщение // функции CallNextHookEx без изменений if(code < 0) { CallNextHookEx(hhook, code, wParam, lParam); return 0; }
// Если пришло сообщение от клавиши <Control>, // проверяем, была ли эта клавиша нажата // три раза подряд if(wParam == VK_CONTROL) { if(!(HIWORD(lParam) & 0x8000)) { nHotKeyCount++;
// Если клавиша <Control> была нажата три // раза подряд, инвертируем флаг bCyrillic и посылаем // сообщение приложению, использующему // данную DLL-библиотеку if(nHotKeyCount == 3) { nHotKeyCount = 0; bCyrillic = ~bCyrillic;
// Посылаем сообщение приложению, установившему // перехватчики. В качестве параметра wParam // сообщения передаем значение флага bCyrillic PostMessage(hwndClient, WM_KBHOOK, (WPARAM)bCyrillic, 0L); } } }
// Если после клавиши <Control> была нажата любая // другая клавиша, сбрасываем счетчик else { nHotKeyCount = 0; }
// Вызываем следующий в цепочке перехватчик return CallNextHookEx(hhook, code, wParam, lParam); }