Я попытался вызвать ToUnicode
внутри низкоуровневой клавиатуры и вывести возвращаемые символы.Однако, похоже, что функция не учитывает, были ли нажаты специальные клавиши, такие как Shift или Caps Lock, поэтому вывод такой же, как и у функции MapVirtualKey
с виртуальным кодом текущей клавиши, переданным в качестве параметра.
Например (pressed keys => characters returned by ToUnicode
):
abcd => abcd (correct)
[caps lock]abcd => abcd (wrong: should be ABCD)
ab[holding shift]cd => abcd (wrong: should be abCD)
Как я вызываю функцию (внутри процедуры подключения):
KBDLLHOOKSTRUCT* pressedKeyInformation = (KBDLLHOOKSTRUCT*)lParam;
BYTE keysStates[256]; // 256 bo tyle virtualnych klawiszy wpisze GetKeyboardState
if(!GetKeyboardState(keysStates))
//error
else
{
WCHAR charactersPressed[8] = {};
int charactersCopiedAmount = ToUnicode(pressedKeyInformation->vkCode, pressedKeyInformation->scanCode, keysStates, charactersPressed, 8, 0);
//std::wcout << ...
}
Позже я заметил, что вызов GetKeyState
слюбой код виртуальной клавиши, переданный в качестве параметра (например, VK_RETURN
, VK_SHIFT
) перед ToUnicode
, заставляет его возвращать правильный символ, например:
abcd => abcd (correct)
[caps lock]abcd => ABCD (correct)
ab[holding shift]cd => abCD (correct)
Он также возвращает должным образом зависимые от локали клавиши клавиатуры, нажатые сЗатем AltGr, например, [AltGr]a => ą
.
Приведенный выше пример не совсем корректен, поскольку возникает другая проблема - если, например, была нажата кнопка caps lock, следующий символ по-прежнему зависит от своего предыдущего состояния, только последние символызатрагиваются, например:
abcd => abcd (correct)
(caps lock is off)[caps lock]abcd => aBCD (wrong: should be ABCD)
(caps lock is off)ab[caps lock]cd => abcD (wrong: should be abCD)
Есть ли у вас какие-либо идеи, почему GetKeyState(<whatever>)
устраняет одну из проблем и в чем причина последнего caps lock (и других специальных ключей)?я проблема?