加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – SendInput()和非英文字符和键盘布局

发布时间:2020-12-14 04:27:20 所属栏目:Windows 来源:网络整理
导读:在 Windows中使用非英语输入键盘语言时,我无法模拟字符按键. 我尝试使用KEYEVENTF_UNICODE调用SendInput(): KEYBDINPUT ki;INPUT input;int character = 0;ki.wVk = 0;ki.wScan = character;ki.dwFlags = KEYEVENTF_UNICODE;ki.time = 0;ki.dwExtraInfo = 0
在 Windows中使用非英语输入键盘语言时,我无法模拟字符按键.

我尝试使用KEYEVENTF_UNICODE调用SendInput():

KEYBDINPUT ki;
INPUT input;
int character = 0;

ki.wVk = 0;
ki.wScan = character;
ki.dwFlags = KEYEVENTF_UNICODE;
ki.time = 0;
ki.dwExtraInfo = 0;   
input.type = INPUT_KEYBOARD;
input.ki = ki;
SendInput(1,&input,sizeof(INPUT));

这实际上是有效的(当然,在我的代码中,我也在键下来之后做一个KEYUP)…除了在GTK应用程序中(可能还有其他实例,它也不起作用).

根据MSDN,如果指定了KEYEVENTF_UNICODE,则SendInput将WM_KEYDOWN或WM_KEYUP消息发送到前台线程的消息队列,其中wParam等于VK_PACKET. GetMessage或PeekMessage获取此消息后,将消息传递给TranslateMessage会发布带有最初由wScan指定的Unicode字符的WM_CHAR消息.如果将此Unicode字符发布到ANSI窗口,则会自动将其转换为相应的ANSI值.

所以我相信当传递KEYEVENTF_UNICODE时,SendInput()的功能是不同的……不像通常那样低级.

对于我的生活,我无法想出任何其他方法来让SendInput()正确打印出用户键盘语言的字符.例如,如果键盘输入语言是“瑞典语”,我不能让它输出’@'(相反,它打印出一个引号),我不能让它输出非正确的ASCII字符,要么(重音字母等).

提前致谢.

解决方法

我发现执行此操作的正确方法是通过使用字符调用VkKeyScanEx()来获取字符的虚拟键代码.返回值的高位字节将告诉您需要“按下”哪些修改键:Control,Alt和/或Shift;低位字节是实际的虚拟键代码.

要获取VK的扫描代码,请调用MapVirtualKeyEx(vkCode,0);

然后,只需使用刚刚获得的信息进行按键模拟即可.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读