首页 > 我的作品 > 被微软的输入法打败了

被微软的输入法打败了

在做TabIMSwitch的新版本的时候,彻底被微软的输入法体系搞郁闷了。

我现在有两个可用的Windows XP系统,一个是我的笔记本,XP Pro 中文版,一个是公司的机器,XP Pro英文版,两台机器都单独装了微软拼音2003(公司因为Office是英文,默认不带微软拼音;笔记本因为不愿用盗版,所以只装了Viewer,也要单独装微软拼音)。本来这个应该非常常见的情况,可是在测试TabIMSwitch的时候被彻底的搞郁闷了。

这个新版本的目的主要是为了解决smth上面有网友提出说不希望自动添加英文Locale。之前我做了一个TabIMSwitch 1.1.0.1的内部版本,这个在我的中文系统上面工作的很好。但是网友回复说仍然不能工作,后来调查之后发现可能是因为英文系统的缘故。然后果然在公司的英文XP上面重现了出来。从目前的情况来看,可能的结果就是在英文XP系统上面带有的微软拼音2003都无法支持,如果不想自动添加英文Locale的话。

造成这个问题的原因很有意思,说起来应该从TabIMSwitch的工作方式开始。

TabIMSwitch的工作机理很简单:TabIMSwitch由两个主要的部分,一个是前端的content\firefoxOverlay.xul及其带有的一批js文件,另一个就是用C++写成的XPCOM组件,位于src\tabimswitch目录下面。两者之间通过Firefox的XPConnect机制联系。XPCOM最初做的很简单,只是封装了一下Windows的KeyboardLayout的系列函数。当Firefox启动之后,会自动加载XPCOM组件和前端的xul文件,并且在xul当中进行必要的消息的hook。当TabIMSwitch发现当前的标签页发生了变化的时候,就会获取到Firefox当前的输入法状态,并将其存入到一个列表当中,然后从这个列表当中获取即将切换到的标签页的输入法(以前保存下来的),并且将其设置成Firefox的当前输入法。

问题在于,微软关于输入法的说明非常的零散,不过基本上围绕在Keyboard Layout和IME两节当中。根据文档的描述,微软拼音输入法和“中文-美式键盘”之间的区别就在于它们是不同的Keyboard Layout。因此,只要存下来这个Keyboard Layout就OK了。TabIMSwitch 1.0.*系列也是这么实现的。

但是就是这种简单的实现在英文版XP+微软拼音输入法上面不工作,经过跟踪之后发现,原因竟然在于,在这种环境下面微软拼音和“中文-美式键盘”之间是完全相同的:无论通过GetKeyboardLayout函数还是GetKeyboardLayoutName函数,得到的都是相同的Keyboard Layout。当时在1.0.*系列当中为了解决这个问题,就自动Load了一个04090409的Keyboard Layout,也就是“英文-美式键盘”,来避免和微软拼音的冲突。所以就有了前面网友提出的那个问题。

后来考虑是不是可以通过IME接口来对输入法进行更加细致的控制,结果非常无奈:似乎对于IME接口来说,微软拼音和“中文-美式键盘”也是相同的。我找到了微软MSDN当中提供的一个sample,揭示了IME接口的使用方式。但是就使这个示例程序,在我的英文XP下面也歇菜了。

目前只能说:完全被微软自己的两个东西搞疯掉了。

你也许会喜欢:

标签: