Операционная система Microsoft Windows 3.1 для программиста -том 3


Листинг 3.12. Файл winhook/kbhook.cpp - часть 4


// ======================================================== // Функция MsgHookProc // Перехватчик для системной очереди сообщений // ========================================================

extern "C" LRESULT CALLBACK MsgHookProc(int code, WPARAM wParam, LPARAM lParam) { LPMSG lpmsg; WPARAM wMsgParam;

// Проверка флага обработки сообщений. Если содержимое // параметра code меньше нуля, передаем сообщение // функции CallNextHookEx без изменений if(code < 0) { CallNextHookEx(hhook, code, wParam, lParam); return 0; }

// Получаем указатель на структуру MSG, // в которой находится перехваченное сообщение lpmsg = (LPMSG)lParam;

// Запоминаем виртуальный код клавиши wMsgParam = lpmsg->wParam;

// Сбрасываем флаг замены сообщения // WM_KEYDOWN на сообщение WM_CHAR BOOL bChange = FALSE;

// Если перехвачено сообщение WM_KEYDOWN, // проверяем код виртуальной клавиши и при // необходимости выполняем замену сообщения if(lpmsg->message == WM_KEYDOWN) { // Замена выполняется только в режиме // русской клавиатуры if(bCyrillic) { // Если нажата клавиша, соответствующая // русской букве, включаем флаг bChange switch(wMsgParam) { // Проверяем "особые" буквы case 0xdb: // "Х" case 0xdd: // "Ъ" case 0xba: // "Ж" case 0xde: // "Э" case 0xbc: // "Б" case 0xbe: // "Ю" case 0xbf: // "Ў" { bChange = TRUE; break; }

// Проверяем остальные буквы default: { if((lpmsg->wParam <= 0x5d && lpmsg->wParam > 0x2f)) bChange = TRUE; } }

// Если нажата клавиша, соответствующая русской // букве, выполняем замену сообщения WM_KEYDOWN на // сообщение WM_CHAR if(bChange) { // Делаем замену кода сообщения lpmsg->message = WM_CHAR;

// Необходимо учитывать состояние клавиш // <Caps Lock> и <Shift> if(GetKeyState(VK_CAPITAL) & 0x1) { if(GetKeyState(VK_SHIFT) & 0x8000) { // Перекодировка по таблице строчных букв lpmsg->wParam = lpXlatTable[(lpmsg->wParam) & 0xff]; } else { // Перекодировка по таблице прописных букв lpmsg->wParam = lpXlatTableCaps[(lpmsg->wParam) & 0xff]; } } else { if(GetKeyState(VK_SHIFT) & 0x8000) { // Перекодировка по таблице прописных букв lpmsg->wParam = lpXlatTableCaps[(lpmsg->wParam) & 0xff]; } else { // Перекодировка по таблице строчных букв lpmsg->wParam = lpXlatTable[(lpmsg->wParam) & 0xff]; } }




Начало  Назад  Вперед



Книжный магазин