IME输入法编程溯源——IME优秀资源索引(Updated 2012.11.20)

posted @ 2012-11-13 07:10 from [FreedomShe]

  自然语言处理课程有个作业是写个输入法,研究良久发现,要写输入法只有IME(Input Method Editor)方式靠谱,于是开始研究IME。结果蛋疼的事情发生了,网上关于IME的文章一般多,却没有一篇告诉你作为码农最需要的权威资料——开发文档——在哪里能够找到。IME既然是微软的东西,万能的MSDN应该会给我详细的开发文档,可是我错了,任凭我花多少时间翻遍MSDN,都没有古老的win32 IME文档的影子,哪怕只是ImeProcessKey, ImeToAsciiEx这种基本函数的介绍都没有。经过N天的等待,终于在此刻找到了我要找的文档,必须记录一下,顺便把最近看到的优秀资源汇总下。
PS:我使用的是windows98时代的IME——imm32.dll,至今我阅读的文章中无一不是用这种古老方法搭建输入法框架。也许现在输入法编程有了更新更好的方法,但是我不知道(除Win8),如果你知道请留言告诉我!如果你在MSDN上找到了IME的文档也请留言告诉我!

  进入正题,权威文档如下:
  1. Win32 Multilingual IME Overview for IME Development
  2. Win32 Multilingual IME Application Programming Interface
  这两篇文档来自于Windows98 DDK(Device Development Kit),关于IME的这两篇中IME的部分在Win32 SDK里面没有,取代DDK的WDK里面也没有,包括整个MSDN都只能找到IMM的部分。有些古老的东西以前的MSDN上面有,但是现在已经找不到了,MSDN改版后网络上提供的链接已经失效。Windows98 DDK可以从这里下载:http://www.mdgx.com/spx/98DDK.RAR,里面不仅包含上述两篇IME的开发文档,而且还有多国的IME输入法C版本例程,在..\98DDK\CABS\I386\IME_DDK.CAB中可以找到。


IME学习流程

1. 什么是IME?外行解释:IME就是微软提供的一个输入法框架,在这个框架里你只需要编写一个dll,实现基本的字码转换等功能,光标跟随等其他输入法通用的杂项都由微软负责完成。因此你编写的dll相当于是这个框架内的一个插件,这个插件就是你自己的输入法。当然,你的输入法dll必须按照IME的规范来编写:
  1). 输入法dll必须包含微软规定的几个导出函数,大部分是以ime开头,如ImeInquire, ImeProcessKey, ImeToAsciiEx。
  2). 你要实现IME的那些函数,你必须用到IMM的一些函数,这些IMM函数的实现在imm32.dll里面,因此你在写输入法的时候必须导入imm.h头文件和imm32.lib库来完成编译。
  3). 你的输入法dll编写好后,后缀名改为标准的.ime,然后注册——实质上是把你的dll拷贝到系统目录,然后向注册表添加一些信息,你就能在Windows的输入法属性里面找到你的输入法了。

  理一理上面的关系:你的dll调用Windows的imm32.dll来获取用户的输入信息,Windows调用你的输入法dll里面的ime函数将转换结果告诉用户。好了,这就是IME框架,你只要做这些,其他的都由Windows操心。

2. 学习IME输入法编程,收集了一些不错的资源,那些抄来抄去还不加引用标记的略过了,这些都是我觉得不错的文章,经过比较原创可能性很大。
  Win下的输入法(IME)编程(1)Win下的输入法(IME)编程(2):这篇的特点是详细地解说了自编输入法的安装和卸载流程,以“空壳输入法”为例子手把手地讲解。
  《浅谈输入法编程》:重要的时刻到了,该文的重点就是例子程序,我的输入法编写就是基于该源码,启程的作者所写,文章也写得很不错,重点突出,看了很有收获。启程输入之星这是他的另外一个源码,比前一个内容丰富很多。其实很多输入法写手包括本文作者都是参考自由拼音freepy来写的,但是freepy源码看过,感觉没有本文作者的源码结构清晰。而且我装的freepy在win7 64位系统下注册后无法运行,原因不明。
  《我的win32 输入法编程心得》:该文的特点是思维连贯,语言简洁,很有逻辑的讲解了IME编程以及要注意的一些问题,重点突出。

  输入法编程指南+IME输入法编程四章.chm:参考文档,比较全面(不过实际上也是照开发文档翻译的),后面那四章被人们copy来copy去不加引用,于是作者不详了。
  《输入法编程漫谈》:(原文出自北大中文论坛,但排版太乱又禁外部IP,贴了另外一处的链接)该文告诉你:输入法编程一点都不难,外行看看涨信心!

  看完上面中的某几篇,你应该能熟悉IME的编程框架并能上手写代码了,无非就是那些ime, imm开头的函数而已(当然还有几个其他函数)。但要想成为IME输入法框架编写高手,还是看看原始的开发文档吧。这里有两篇不全的翻译:Windows 95 输入法编辑器翻译:windows2000 DDK中IME输入法编程的资料(前10页)


  IME纯C版本,那些复杂的结构体大致搞清楚他们之间的关系不算太困难,但是要想搞懂每个结构体里面的变量定义,以及如何使用它们,恐怕不是那么简单,特别是在网上相关资料匮乏的情况下。其实要生成输入法,如果不是专业的输入法制作团队,完全没必要去研究这该死的98C版IME,用个输入法生成器舒服得跳过IME的编写过程。推荐:多多输入法生成器,功能齐全!

posted @ 2012-11-13 07:10 FreedomShe 阅读(...) 评论(...) 编辑 收藏