Windows – ToAscii / ToUnicode在键盘钩子中销毁死锁

看来如果在全局WH_KEYBOARD_LL钩子中调用ToAscii()或ToUnicode(),并且按下一个死键,它将被“销毁”.

例如,假设您已将Windows中的输入语言配置为西班牙语,并且要在程序中键入重音字母á.通常,您可以按单引号键(死键),然后按字母“a”,然后在屏幕上按照预期显示重音á.

但是,如果您在低级别的键盘挂接功能调用ToAscii()或ToUnicode(),则此功能无效.看来死钥匙被毁了,所以没有重音字母á显示在屏幕上.删除对上述功能调用解决了问题…但不幸的是,我需要能够调用这些功能.

我已经Google Googled了一段时间,而很多人似乎都有这个问题,没有提供好的解决方案.

任何帮助将不胜感激!

编辑:我正在调用ToAscii()将我的LowLevelKeyboardProc挂钩功能中接收到的虚拟键代码和扫描代码转换为用户显示在屏幕上的结果字符.

我尝试MapVirtualKey(kbHookData-> vkCode,2),但这不像ToAscii()一样完整的函数;例如,如果您按Shift 2,您将获得’2′,而不是’@'(或Shift 2将为用户键盘布局/语言产生的任何东西).

ToAscii()是完美的,直到一个死键被按下.

EDIT2:这是钩子功能,删除不相关的信息:

@H_301_17@LRESULT CALLBACK keyboard_LL_hook_func(int code,WPARAM wParam,LPARAM lParam) { LPKBDLLHOOKSTRUCT kbHookData = (LPKBDLLHOOKSTRUCT)lParam; BYTE keyboard_state[256]; if (code < 0) { return CallNextHookEx(keyHook,code,wParam,lParam); } WORD wCharacter = 0; GetKeyboardState(&keyboard_state); int ta = ToAscii((UINT)kbHookData->vkCode,kbHookData->scanCode,keyboard_state,&wCharacter,0); /* If ta == -1,a dead-key was pressed. The dead-key will be "destroyed" * and you'll no longer be able to create any accented characters. Remove * the call to ToAscii() above,and you can then create accented characters. */ return CallNextHookEx(keyHook,lParam); }
>停止使用ToAscii()并使用ToUncode()
>记住,ToUnicode可能会在死钥匙上返回任何东西 – 这就是为什么它们被称为死钥匙.
>任何键都有一个扫描码或虚拟键码,但不需要一个字符.

您不应该将按钮与字符组合 – 假设任何键/按钮都有文本表示(Unicode)是错误的.

所以:

>输入文本使用Windows报告的字符>用于检查按钮(例如游戏)使用扫描码或虚拟键(可能虚拟键更好).>键盘快捷键使用虚拟键码.

相关文章

(1)when you ping a computer from itsafe,the ping command should return the local IP address. (...
1、点击win菜单,点击设置图标 2、选择系统选项 3、选择应用与程序选项 4、拉到最下方,选择程序与功能...
目前一直直接往Windows 2008 R2 Server中复制文件(暂时还没有搭建ftp服务),突然不能复制了,于是百度...
windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,p...
在控制面板的程序与功能里启用和关闭windows功能打开,适用于linux的windows子系统
效果演示 推荐一个非常牛的文档网站生成器:docsify 我通过这个工具,成功将码云上的个人学习笔记发布到...