版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weolar/article/details/101085406
flash的中文问题比较麻烦,参考了chrome的代码:E:mycodechromium.bb-mastersrccontentchildnpapiwebplugin_ime_win.h
得知,要IAT hook flash里的ImmAssociateContextEx api。原因是因为flash是通过这几个api去取ime发来的字符串,而不是通过WM_CHAR消息。
然后在这里我遇到了第一个坑。
我移植了代码后,发现还是打不了中文,但输入法输入的英文是有反应的。所以我猜测flash内部会在WM_CHAR消息里获取是输入法传来的,还是直接键盘消息。所以我拦截了ImmGetProperty,然后返回0xd000a。吐槽一下,这个0xd000a我至今都不知道什么意思,微软文档也没写啥。
这时更奇怪的现象出现了,中文可以显示,但输入法输入的英文有问题。
具体如下:
IME 发英文字母消息: go compositionUpdated: 正常显示一个 go dispatchNPEvent: 不能显示 什么都不走: 不能显示
keyboard 发英文字母消息: go compositionUpdated: 可以显示,但有两个同样字母 go dispatchNPEvent: 正常显示一个 什么都不走: 正常显示一个
所以我打算找个api判断下这个WM_CHAR消息是来自输入法还是直接键盘消息。我用的也是ImmGetProperty,
因为我发现这货在非输入法消息,也就是键盘消息下会返回0xd000a。但比较坑的是,win7下没问题,win10下却无论输入法消息还是普通键盘消息都返回0xd000a。
最后我的解决方案是用WM_IME_CHAR。因为这个消息在非输入法下是没有的。但此时依然要hook ImmGetProperty,返回0xd000a。另外还有个小点,就是要记得发送WM_SETFOCUS。不然flash也不显示中文。