19.9.21日报:修复flash中文问题

2019-10-25 10:17:05 浏览数 (1)

版权声明:本文为博主原创文章,遵循 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也不显示中文。

0 人点赞