【问题标题】:Why does VkKeyScanW return -1 for unicode characters?为什么 VkKeyScanW 对 unicode 字符返回 -1?
【发布时间】:2015-04-03 04:19:28
【问题描述】:

我正在尝试使用 VkKeyScanW 函数将字符转换为相应的虚拟键代码。它适用于 ASCII 字符,但在传递 unicode 字符(中文/俄文字符)时会失败。

short vcode = VkKeyScanW(ch); //ch is of wchar_t type;
cout<<"key code:"<<vcode<<endl; //always prints -1 for unicode characters.

我在这里做错了什么?还有其他方法可以实现吗?我想将虚拟键代码传递给 SendInput 函数。

VkKeyScanW function documentation

【问题讨论】:

    标签: c++ windows winapi unicode sendinput


    【解决方案1】:

    VkKeyScan() documentation 说:

    将字符转换为相应的虚拟键代码并转换当前键盘的状态

    ...

    返回值

    ...

    如果函数没有找到可以转换为传递的字符代码的键,则低位和高位字节都包含–1。

    很明显,它无法在当前键盘布局中为您传递的 Unicode 字符找到匹配的键码。

    尝试改用LoadKeyboardLayout()VkKeyScanEx(),确保选择中文/俄文键盘布局。

    还请记住,VkKeyScanW()VkKeyScanExW() 只接受 1 个 WCHAR 作为输入,但像中文这样的语言通常需要 2 个 WCHAR 值作为一个代理对一起工作一个 Unicode 字符。此类字符不适用于VkKeyScan/Ex()

    话虽如此,您无需将 Unicode 字符转换为虚拟键码即可使用SendInput()。它可以使用KEYEVENTF_UNICODE 标志直接接受Unicode 字符。在代理对的情况下,您只需指定两个输入事件,每个 WCHAR 一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2013-05-24
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      相关资源
      最近更新 更多