Не удается преобразовать код виртуального ключа в юникод

Мне нужно ввести текст в приложения прямого ввода. Я использую SendInput, но использование кодов виртуальных клавиш не работает с прямым вводом, поэтому мне нужно использовать Unicode. Теперь ключи, которые я не хочу вводить, зарегистрированы в файле как коды виртуальных ключей, и мне нужно преобразовать их в Unicode в режиме реального времени.

return1 = ToUnicode(vk, MapVirtualKey(vk, MAPVK_VK_TO_VSC), NULL, buffer, 1, 0);

Это моя строка кода. vk — это виртуальный ключ в int, а буфер — это массив wchar_t размером 1 единица. Я не мог использовать простой wchar_t, потому что он не работал с ToUnicode. Однако эта функция каждый раз просто возвращает 0, что означает, что функция не может преобразовать ключ. Для записи я использую стандартные клавиши, такие как «wasd», без специальных символов. Если кто-нибудь может понять, почему это происходит, мне бы очень нужна помощь.

Спасибо за внимание!

РЕДАКТИРОВАТЬ: также, было бы удобно просто бороться с моей ленью и написать какой-нибудь старый переключатель и сломать, чтобы преобразовать значения? например.

wchar_t unicode;
switch (vk)
case '0x30':
    unicode = '48';
    //ecc...

person Alex    schedule 06.08.2014    source источник
comment
Было бы полезно, если бы вы указали точный случай сбоя ... включая фактические значения. Например, скажите, что такое vk, и результат MapVirtualVk(vk, 0). Кроме того, для второго параметра MapVirtualKey определены константы... поэтому MAPVK_VK_TO_VSC понятнее, чем просто сказать 0.   -  person HostileFork says dont trust SE    schedule 06.08.2014
comment
Во всяком случае, редактируя вопрос, как я уже писал, это происходит с каждым ключом. Результат MapVirtualVk(vk, 0), как я думаю, должен быть, зависит от ключа. например 3 дает 44, а дает 3030.   -  person Alex    schedule 06.08.2014


Ответы (1)


В нем говорится, что массив «keys» является необязательным, но если я не передам ключи, я тоже получу нулевой результат. Может быть, они просто имеют в виду, что у вас есть возможность заставить его работать или нет?

std::vector<BYTE> keys(256, 0);
int sc = MapVirtualKey(vk, MAPVK_VK_TO_VSC);
return1 = ToUnicode(vk, sc, keys.data(), buffer, 1, 0);

Так что попробуйте это (или &keys[0] вместо keys.data(), если вы не используете C++11).

person HostileFork says dont trust SE    schedule 06.08.2014
comment
Спасибо! Теперь ToUnicode возвращает правильные значения, хотя SendInput с включенным флагом юникода, wVk = 0 и Input.ki.wScan=buffer[0] по-прежнему ничего не печатает :( - person Alex; 06.08.2014
comment
Один маленький ответ, если вы его знаете, спасибо, если нет, то все равно спасибо. Могу ли я просто ввести в wScan коды, полученные из ToUnicode (например, для a, 97), или мне нужно как-то их обработать? - person Alex; 06.08.2014
comment
@Alex Поддельный ввод - это в первую очередь хитрое искусство, и я мало что знаю о DirectInput. Так что действительно лучше открыть новый вопрос и дать очень точные тестовые примеры, которые не работают, чтобы другие люди могли их воспроизвести. - person HostileFork says dont trust SE; 06.08.2014
comment
Да, уже открыл другой вопрос и уже решил проблему через 10 минут. Мне не нужно было использовать Unicode, только коды аппаратного сканирования. Спасибо, в любом случае! - person Alex; 06.08.2014