为什么VkKeyScanW为unicode字符返回-1?

时间:2015-04-03 04:19:29

标签: c++ windows winapi unicode sendinput

我正在尝试使用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

1 个答案:

答案 0 :(得分:2)

VkKeyScan() documentation说:

  

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

     

...

     

返回值

     

...

     

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

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

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

另请注意,VkKeyScanW()VkKeyScanExW()仅接受1 WCHAR作为输入,但像中文这样的语言通常需要2个WCHAR值作为代理对以形成Unicode字符。这些字符不适用于VkKeyScan/Ex()

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