Регистрация клавиатуры Windows. Черта сообщения WM_CHAR в различных приложениях

Добрый день. Возникла необходимость следить за набираемым текстом, т.е. не нажатиями клавиш, а именно производными символами.

В начале я использовал необработанный метод ввода для получения кодов виртуальных клавиш нажатых клавиш, но от этого решения пришлось отказаться, т.к. не удалось правильно преобразовать коды виртуальных клавиш в символы.

MapVirtualKeyEx + LoadKeyboardLayout - не дали должного эффекта, т.е. если загрузить русскую раскладку вызовом LoadKeyboardLayout, то MapVirtualKeyEx все равно возвращается на латиницу А по коду 0x41.

Поэтому я начал использовать хук WM_GETMESSAGE.

if (nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);

// WH_GETMESSAGE
if (nCode == HC_ACTION)
{
    PMSG pMsg = (PMSG)lParam;
    if (pMsg != NULL)
    {
        if ((pMsg->message == WM_CHAR)||(pMsg->message == WM_UNICHAR))
        {
            keyEntry.character = pMsg->wParam;
            ipc->SendData(&keyEntry, sizeof(CHARENTRY));
        };
    };
};

return CallNextHookEx(NULL, nCode, wParam, lParam);

Все работает нормально, в том числе и для персонажей с мертвым ключом.

Но при попытке набрать текст в редакторе визуальной студии возникли проблемы:

  • На одно нажатие клавиши приходит два одинаковых сообщения WM_CHAR;
  • Для кириллических символов значение WM_CHAR->wParam не совпадает с набранными символами, для латиницы - все в порядке.

Как преобразовать код виртуального ключа в символ с учетом языка ввода процесса, в котором набирается текст + возможность набирать составные символы (например: ô). Или подскажите как решить проблемы в версии с хуками.

Заранее спасибо )


person user1190727    schedule 23.08.2012    source источник


Ответы (1)


Клавиатура генерирует два кода сканирования, когда пользователь набирает клавишу: один, когда пользователь нажимает клавишу, а другой, когда пользователь отпускает клавишу.

Источник: О вводе с клавиатуры — http://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx

WM_CHAR будет только UTF-16, если приложение скомпилировано для Unicode в качестве кодировки символов (т.е. разница между MBCS и UNICODE). Если ваше приложение построено с использованием MBCS (многобайтовый набор символов), то система будет использовать текущую системную кодовую страницу для преобразования символа Unicode в «Ansi» (в кавычках) и отправки его.

Поэтому проверьте в настройках сборки, для какой кодировки символов настроено ваше приложение.

Источник: поддержка Unicode и многобайтовых символов (MBCS): http://msdn.microsoft.com/en-us/library/ey142t48(v=vs.80).aspx

person Software_Designer    schedule 23.08.2012