无法从虚拟键码转换为 unicode

Posted

技术标签:

【中文标题】无法从虚拟键码转换为 unicode【英文标题】:Can't convert from virtual key code to unicode 【发布时间】:2014-08-06 01:07:06 【问题描述】:

我需要将文本注入到直接输入应用程序中。我正在使用 SendInput,但使用虚拟键码不适用于直接输入,所以我需要使用 Unicode。现在,我不想注入的键在文件中注册为虚拟键码,我需要将它们实时转换为 Unicode。

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

这是我的代码字符串。 vk 是 int 中的虚拟键,buffer 是一个 wchar_t 数组大 1 单元。我不能只使用一个简单的 wchar_t,因为它不适用于 ToUnicode。 但是,这个函数每次都只返回 0,这意味着该函数无法翻译密钥。 作为记录,我使用的是标准键,例如“wasd”,没有特殊字符。 如果有人能弄清楚为什么会发生这种情况,我真的很想得到一些帮助。

感谢您的考虑!

编辑:另外,与我的懒惰作斗争并编写一些旧的 switch 和 break 来转换值是否方便?例如。

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

【问题讨论】:

如果你给出一个失败的确切情况会有所帮助......包括输入的实际值。例如说vk是什么,以及MapVirtualVk(vk, 0)的结果。此外,MapVirtualKey 的第二个参数有为其定义的常量......所以MAPVK_VK_TO_VSC 比只说 0 更清晰。 编辑问题,无论如何,正如我所写的,每个键都会发生这种情况。我认为应该是 MapVirtualVk(vk, 0) 的结果取决于密钥。例如“3”给出 44,“a”给出 3030。 【参考方案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);

所以尝试一下(如果您不使用 C++11,则使用 &amp;keys[0] 而不是 keys.data())。

【讨论】:

谢谢!现在 ToUnicode 返回正确的值,即使 SendInput 带有 unicode 标志,wVk = 0 和 Input.ki.wScan=buffer[0] 仍然不打印任何内容:( 一个小答案,如果你知道,谢谢,如果不知道,还是谢谢。我可以将 ToUnicode 生成的代码放入 wScan(例如,对于“a”,97),还是必须以某种方式处理它们? @Alex 伪造输入首先是一种狡猾的艺术,我对 DirectInput 了解不多。所以最好打开一个新问题,并给出非常精确的测试用例,这些用例不起作用——这样其他人就可以重现它。 是的,已经打开了另一个问题,并且在 10 分钟后已经解决了问题。我不必使用 Unicode,只需使用硬件扫描码。无论如何谢谢!

以上是关于无法从虚拟键码转换为 unicode的主要内容,如果未能解决你的问题,请参考以下文章

C#如何将虚拟键码转换为字符?

将虚拟键码转换为 unicode 字符串

Purescript无法从键盘获取键码

键盘扫描码 ASCII码的区别?

尖括号的虚拟键码

SDL 物理键码和 SDL 虚拟键码有啥区别?