在刚写到 标签 备注 书签 的时候,我就发现这个问题了, 比如加载一个程序,点击反汇编窗口,然后按备注/注释的热键 ;(分号) 在中文输入法下,你按分号是没有效果的.测试od1.x是要按两次 ;(分号) 才能弹出备注窗口. od2.x 和 odx64 是完全没有效果.
测试yzdbg一样没有效果.
测试x64dbg有效果.
---------------------------------------------------
分析问题:
我在回调的 wm_keydown 消息里下断, 分析发现, 正常情况 ;(分号) 应该是 VK_OEM_1, 可是到达的确是VK_PROCESSKEY.
原来是安装三方输入法后, 在切换到三方输入法后,用户按键就会全部变成VK_PROCESSKEY.
解决方案:
既然是输入法的问题,那很简单,关闭输入法就行了. 搜索了一下, 发现 ImmDisableIME 函数可以关闭输入法.
ImmDisableIME
但是关闭之后, 你要在备注或者标签栏上输入中文是输入不了的. 除非在临时打开. 这样太过麻烦了.
后来搜索发现 Imm 开头的有一系列相关函数. 其中有一个 ImmGetVirtualKey 函数, 这个函数可以将用户输入的 转化成 原先的键值.
ImmGetVirtualKey
上面这个是 01年10月份的离线MSDN说明. 按上面的在 wm_keydown 下面调用后发现获取的返回值还是 VK_PROCESSKEY, 很是奇怪,在网上找了一圈也没有找到类似的问题.
于是到在线的MSDN上看了一下, 发现内容和离线版的说明有点不一样.如下:
ImmGetVirtualKey
重点看返回值这句: If TranslateMessage is called by the application, ImmGetVirtualKey returns VK_PROCESSKEY; otherwise, it returns the virtual key.
我理解的大概意思就是调用的时机晚了.我将调用放到 getmessage 消息循环中调用,发现成功返回虚拟键值. 如下:
解决中文输入法失效
最终问题终于解决掉了 :)
|