19.9.21日报:修复flash中文问题

flash的中文问题比较麻烦,参考了chrome的代码:E:\mycode\chromium.bb-master\src\content\child\npapi\webplugin_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也不显示中文。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值