前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >19.9.21日报:修复flash中文问题

19.9.21日报:修复flash中文问题

作者头像
龙泉寺扫地僧
发布2019-10-25 10:17:05
4770
发布2019-10-25 10:17:05
举报
文章被收录于专栏:盟主来了盟主来了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weolar/article/details/101085406

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也不显示中文。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-09-21 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档