现在的位置: 首页 > 综合 > 正文

Win32输入法编程技术的分析研究

2014年09月05日 ⁄ 综合 ⁄ 共 6279字 ⁄ 字号 评论关闭

作者:新疆大学 巴力登 陆莲芳

【摘要】本文论述了Win32输入法编程技术的基本原理、技术要点及其实现的方法. 并分析研究了基于IMM-IME结构的输入法的构成、接口、设计方法与核心技术问题。 
【关键词】输入法编辑器;输入法管理器;输入法用户接口;键盘消息

1、概述

  对于任何一种文字信息处理系统来讲,包括中、日、韩,蒙文,藏文,阿拉伯文(维哈柯文)等,首先解决的技术问题是文字的输入。比如移动电话、网络电话等也不例外,同样在办公自动化软件、字处理软件、行业专用软件、嵌入式软件、视频软件等等,所有的软件都需要有输入法支持。根据输入设备的不同可以将常用中文输入法分为3类:键盘输入法、笔输入法和语音输入法。从实现输入这个技术问题而言,目前的输入技术实现可划分为:(1)外挂的具有输入法功能的应用软件;(2)具有输入法功能的文字编辑软件;(3)“IMM-IME”的结构实现输入法编程技术;(4)嵌入式数字化输入技术等等。微软是相当重视输入法软件市场的,所提供的开发输入法开发平台工具种类比较多,如vc++6.0,vc++.net
,SDK Win32 API等。其中输入法的实现最规范,最有效的方式之一是:使用Windows IME API(应用程序接口)即利用Windows所提供的输入法管理器和输入法编辑器的结构—“IMM-IME”的结构实现输入法编程。

  字体技术和文本技术是文本显示的两个关键技术。输入技术是研究中文信息处理的一个重要课题,包括我国少数民族语言文字信息处理在内,应用在Win98/XP或(linux/unix)环境中,输入、显示、输出或打印。

  输入法实现的总体思路是:通过不同的方式获取用户输入的信息,再经过转换引擎将输入的信息转换成为其对应的字符;如果出现多种转换结果,则出现选择窗口,最后由用户选择所需要的文字。对于中文Windows操作系统而言,则将结果汉字字符串转换成相应的汉字字符信息,发送到应用程序窗口,完成汉字的输入过程。

2、WINDOWS输入法的基本原理

  Windows IME是Windows支持的多语言核心组件之一,为输入法的开发提供了强有力的支持, Windows XP与基于每个目标国家最常用的输入法的标准IME一起发布,而且大量第三方开发上出售IME软件包。Windows2000和Windows XP 中的IME模块适合于一种规模更大的机制,这种机制可以把用户输入传递给应用程序。

  Windows系统下汉字输入法实际上是将输入的标准ASCII字符串按照一定的编码规则转换为汉字或汉字串,再输入到目的地。由于应用程序各不相同,用户不可能自己去设计转换程序,因此,汉字输入由Windows系统进行管理。

  IMM(Input Method Management):输入法管理器。这是Windows操作系统多语言支持环境的内在组成部分。操作系统通过输入法管理器管理当前系统中活动的各个输入法编辑器,维护输入法编辑器和应用程序之间的通信。

  IMP(Input Method Profile):输入法分析器。该模块负责维护系统所安装的各种汉字输入法的有关信息,并负责更新保存这些信息的IMEINFO.INI文件。

  IME(Input Method Editor):输入法编辑器。这是汉字输入法程序员所需编写的主要部分。具体每种输入法的算法就在该模块中实现。该模块从系统中接收键盘消息,经过输入法所定义的有关转换产生汉字字符或词组。

  WINNLS:WINNLS.DLL是WINDOWS简体中文版中汉字支持的核心。上述的三个系统提供的用于支持汉字输入法的模块都包含在这个DLL文件中。

2.1 输入法与系统的关系

  输入汉字中文键盘及外设输入整个流程如图1所示:

图1  输入汉字中文键盘及外设输入流程图

  Windows用户在使用各种应用软件时,键盘输入中文时经过以下各种过程,下面这个过程是一个比较典型的中文输入过程:
  (1)用户按下键盘,键盘驱动程序向Windows发送及时信息;
  (2)Windows将键盘事件处理转换键盘信息传送给输入法管理器;
  (3)输入法管理器调用当前使用的输入法IME的函数ImeProcessKey (),传送键盘信息到输入法IME;
  (4)输入法IME接收到键盘消息,开始输入到中文的转换,如果不进行转换,则输入法管理器将其直接送到应用程序;
  (5)将转换好的中文字符(串),输入法IME通过ImeToAsciiEx()返回参数发送中文字符(串)到输入法管理器;
  (6)输入法管理器通过Windows向应用程序发送WM_IME_REPORT信息,使用IR_DBCSCHAR参数查询应用程序是否具有双字节能力,如果应用程序能接收双字节,则输入法管理器向应用程序发送一个WM_CHAR消息传送一个汉字(其中wParam参数是双字节汉字),如果应用程序不能接收双字节,则输入法管理器向应用程序发送两个WM_CHAR消息传送一个汉字(第一次wParam参数的低字节是汉字的第一字节,第二次wParam参数的低字节是汉字的第二字节)。

  对于笔输入、语音输入和鼠标输入方式输入中文的用户,一般是通过以下过程输入中文:
  (1)输入设备将接收到的数据传送到输入法驱动程序;
  (2)输入法驱动程序将接收到的数据进行识别,转换成为众位字符(串);
  (3)调用函数传送中文字符(串)到输入法管理器,输入法管理器通过Windows将中文字符(串)输入到应用程序。

  输入法的程序后缀名为ime,数据文件后缀名为MB,即通常说的输入法编码表(字典)。实际上IME文件是一个动态连接库程序(DLL),它与DLL文件没有区别,只是名称不同而已。

2.2  IME处理过程

  输入法编辑器(IME),又叫做前端处理器,允许用户使用键盘,输入在各国书面语言中使用的各种字符,从而达到输入非拼音文字的目的。目前,在Windows下通过IME可以输入中文、日文、韩文等远东国家的象形文字。       
  Windows中所带的标准IME是基于各个国家中      图2 IME的原理流程图
  使用的最流行的输入方法,还有许多第三方销售商也出售IME包。一个IME一般包含一个转换引擎,用于将键盘上的按键转换到表意或表音文字,这个转换工作主要依靠一张输入码对照表来完成。用户采用以下这几种方法来构造每个字符:通过子根、通过发音表或者通过键入字符的数字代码页索引。当用户在键盘上按下键后,IME的转换引擎截获这个按键,判别按键的类型,根据类型或进行状态处理,或进行输入码到汉字机内码的转换,或提示重码供选择,或直接返回给应用程序,从而实现一个IME应有的功能。IME的原理如图2所示   

2.3  IME的组成部分

  输入法程序为用户与WINDOWS操作系统提供了两个接口,即IME转换接口(IME Conversion Interface)和IME用户接口(IME User Interface)。IME转换接口以函数集的形式出现,这些函数一般由输入法管理器IMM和应用程序调用。主要完成以下工作:
  (1)IME的初始化和关闭;
  (2)代码转换,包括输入码到汉字词和汉字词到输入码的转换;
  (3)IME的设置以及IME的界面、状态的修改;
  (4)输入字符的处理; 
  (5)定义新的词组。

  IME用户接口则以窗口形式出现,是由一些可见或不可见的窗口组成的,主要的作用是接受各种消息以及为IME提供用户接口的界面。用户接口的各个窗口组成如图3所示。
  IME窗口是基于Windows的User.exe中 “ime”这个类的一个不可见窗口。应用程序可以创建IME窗口,一个应用程序对应一个IME窗口,它管理应用程序所有的可选输入法,通过处理消息WM_IME_SELECT在多个输入法间切换,处理输入法中的用户接口以及应用程序和IMM发送到输入法的所有消息。
  UI窗口是某个输入法的总控窗口,它是IME窗口的一个子窗口。它的作用是接受由IMM和应用程序发送来的消息,并根据消息进行相应的处理。另外,它还创建状态窗口、输入窗口和候选窗口,并保存这些窗口的基本数据。
  状态窗口用于显示当前的输入法状态,如输入法名称、半角/全角、中西文状态、中文/西文标点符号和软键盘的等信息。
  输入窗口用于显示输入的输入码、部分结果字符串、错误信息等提示内容。
  候选窗口用于列出当前编码的全部汉字(串),供用户选择或查询。

2.4  应用系统对IME的支持

  一个Windows系统中可能同时安装了多个IME,而系统中也可能同时运行好多个应用程序,每一个应用程序可分别与一个IME之间建立联系。应用系统可以向IME发送消息。这些消息允许应用系统请求IME处理IME转换窗口的定位,允许或禁止转换窗口的显示,在转换窗口使用某一种字体,以及执行某一个虚键等。
  在具有多语言支持环境的Windows系统中,每一个应用系统的窗口都有一个输入上下文句柄,该句柄是一个指向特定输入上下文(Input Context)的指针,其中记录与输入法编辑器有关的用户输入信息。输入法管理器通过它保存和维护与输入法编辑器有关的数据(如转换状态、写作串、候选列表内容等),实现与输入法编辑器和应用程序的数据通信。
  根据应用系统对IME消息的处理多少把输入法应用程序分为三类:IME不受控的应用程序、IME部分受控的应用程序和IME全受控的应用程序。
  (1)IME不受控的应用程序(IME unaware application)  
  该类型应用程序虽然不能控制IME,且不能产生自己的IME窗口和输入环境(Input Context),但是一旦输入双字节字符(DBCS characters),系统默认的输入法窗口(Default IME Window)和输入环境(Default Input Context)即能将输入的字符传送给应用程序。
  (2)IME部分受控的应用程序(IME half – aware application)
  该类型应用程序可利用系统预定义的IME类产生自己的IME窗口(Application IME Window),并可将输入环境传递给应用程序,因此应用程序可控制IME的不同环境(例如IME的打开与关闭、IME的组成形式等),但应用程序并不显示IME任何用户接口。
  (3)IME全受控的应用程序(IME full – aware application)
  该类型应用程序可完全控制IME,通过自身就能获取输入环境,并显示各种必要的信息。 此时,IME只在幕后负责必要的处理与消息提供,使用者的输入操作接口完全由应用程序负责维护。
  IME全受控的应用程序从IME DLL接管了绘制IME窗口(状态、写作和候选窗口)的责任、创建并维护它们自己的输入上下文。这类应用系统可以完全的定制这些窗口的外观,包括确定其屏幕位置以及选择显示器中字符所用的字体和字体风格等等。而IME DLL仍然确定在IME写作和候选窗口中显示哪些字符,并且它还处理字符猜测和在IME字典中进行字符查找的算法。

3、IME的实现

  输入法的实现主要是对IME转换界面的接口函数的实现。以下这些函数在适当的时候供输入法管理器调用,其实并不是每一个输入法编辑器在实现时都需要在这些接口函数中添加代码,大部分情况下很多函数保留一个空函数体即可。程序中的输出函数(必须)即文件“.def”中的函数,以下为函数的名称及功能论述,参考 MSDN 中的有关文档。
  ImeInquire:此接口函数在用户选择某个输入法时最先由输入法管理器调用,以获得该输入法的有关信息。函数应返回输入法编辑器的初始化信息,在IMEINFO结构中设置当前输入法的各种属性,以及当前输入法的用户界面窗口类名称。
  ImeProcessKey:此接口函数由输入法管理器在处理键盘事件时调用。在此函数中对键盘事件进行预处理,根据此函数的返回值,系统确定对于特定的输入上下文来说此键盘事件是否应送交输入法编辑器进行处理。如果返回TURE,则表示应该先把键盘消息传到输入法编辑器进行处理,所以输入法管理器会接着继续调用ImeToAsciiEx函数;如果返回FALSE,说明此消息不需要输入法编辑器进行处理,输入法管理器将其直接送到应用程序。
  ImeToAsciiEx:根据输入法上下文的内容,使输入法编辑器的转换引擎产生转换结果,将相应的字符消息放入制定缓冲区中,返回值是产生消息的条数,如果此数量大于消息缓冲区的长度,系统转而从输入法上下文的hMsgBuf项中度区消息的内容。该函数和ImeProcessKey函数一起构成了键盘输入方式下输入法编辑器转换引擎的主体。
  ImeSelect:此接口函数在用户打开或关闭输入法上下文时被调用。在此函数中对输入法上下文内容进行初始化或恢复释放。在实现某个输入法编辑器的时候,可能需要对输入法上下文中包含的内容项进行扩充,扩充后的输入法上下文称为此输入法的是由上下文。在打开输入法时,函数的fselect参数为TRUE,需要完成对标准的输入法上下文的扩充工作,申请追加内存,预设各个内容项的初值;在关闭输入法时,fSelect参数为FALSE,需要释放思友上下文申请的附加资源。
  ImeSetActiveContext:如果在某个窗口中打开了输入法编辑器,那么此函数会在应用程序窗口获得或失去输入焦点时被调用。在此函数中可以获得当前的输入法上下文并通知输入法编辑器用户界面窗口组件,令其刷新显示。
  NotifyIME:系统或应用程序通知输入法编辑器其根据参数修改输入法编辑器的当前状态。比如:显示、隐藏候选窗口,选定某个后选项,更新候选窗口页起始位置和页尺寸,更新输入法上下文内容,修改写作串内容等等。
  ImeDestroy:结束输入法编辑器的工作。
  ImeCoversionList:根据输入上下文的有关内容,将一个字符或者字符串转换成远东字符结果列表或者另一个字符串。此函数的作用是在输入串和结果串之间进行转换以便于进行重新转换,所以在此函数中不应该产生任何相关的输入法编辑器消息。
  ImeEscape:应用程序通过调用这个函数可以直接访问某个输入法编辑器的特定功能,这些功能通常无法通过其他的IMM函数调用实现。这么做的目的主要是为了支持特定语种的函数或者IME的私有函数。
  ImeSetCompositionString:根据参数中给出的数据,修改写作字符串。这个函数将向输入法编辑器发送一条WM-IME-COMPOSITION消息。
  ImeRegisterWord:向输入法编辑器的词典里增加一个新词。
  ImeUnregisterWord:把某个词从输入法编辑器的词典里去掉。
  ImeGetRegisterWordStyle:取得本输入法编辑器支持的词风格的列表。
  ImeEnumRegisterWord:列出符合给定条件的所有字符串。

4、结束语

  本文分析了Windows IME实现的基本原理、输入法的体系结构和设计中的一些关键技术,Windows IME体系结构不仅为我们设计新的IME提供了规范,而且也为我们留了足够的空间来实现IME特有的各种功能。输入法程序设计所涉及的知识及技术还包括软键盘处理、鼠标输入、输入法注册、输入法数据结构及文件格式等。限于篇幅,仅对部分程序设计的实现方法作了说明,可供大家参考。

抱歉!评论已关闭.