Добрый день. Возникла необходимость следить за набираемым текстом, т.е. не нажатиями клавиш, а именно производными символами.
В начале я использовал необработанный метод ввода для получения кодов виртуальных клавиш нажатых клавиш, но от этого решения пришлось отказаться, т.к. не удалось правильно преобразовать коды виртуальных клавиш в символы.
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 не совпадает с набранными символами, для латиницы - все в порядке.
Как преобразовать код виртуального ключа в символ с учетом языка ввода процесса, в котором набирается текст + возможность набирать составные символы (например: ô). Или подскажите как решить проблемы в версии с хуками.
Заранее спасибо )