IME输入法编程

本文深入探讨IME输入法的编程技术,涉及Windows API的使用、结构体(struct)的处理,揭示了输入法开发中的关键概念和实践技巧。
Windows9x系统下汉字输入法的基本原理
转帖:http://forum.mywuzhen.com/thread.jsp?forum=7&thread=1835&tstart=0&trange=15
  Windows系统下汉字输入法实际上是将输入的标准ascii字符串按照一定的编码规则转换为汉字或汉字串,进入到目的地。由于应用程序各不相同,用户不可能自己去设计转换程序,因此,汉字输入自然而然落到WINDOWS系统管理中。

一、输入法与系统的关系

     键盘事件  应用程序
       |    |
      Windows的USER.EXE
         |
       输入法管理器
         |
        输入法 

  系统的键盘事件有windows的user.exe软件接收后,user.exe在将键盘事件传导输入法管理器(Input Method Manager,简称IMM)中,管理器 再将键盘事件传到输入法中,输入法根据用户编码字典,翻译键盘事件为对应的汉字(或汉字串),然后再反传到user.exe中,user.exe再将翻译后的键盘事件传给当前正运行的应用程序,从而完成汉字的输入。

二、汉字输入法的组成

微软Windows9x系统中汉字输入法的名称是"Input Method Editor" ,简称IME,输入法的程序名称为:*.ime,数据文件名称为*.MB,即通常说的输入法编码表(字典).

实际上IME文件是一个动态连接库程序(DLL),它与dll文件没有区别,只是名称不同而已。

一般汉字输入法都由三个窗口组成:

状态窗口(Status Windows)-显示当前的输入法状态(中文还是英文等站环信息);

编码输入窗口(Composition Windows)-显示当前击键情况;

汉字选择窗口(Candidates Windows)-列出当前编码的全部汉字(串),供用户选择或查询。

上述三个窗口由基本的用户接口(User Interface )函数管理着。

现在我们用Dumpbin.exe打开微软提供的拼音输入法(WINDOWS/SYSTEM/WINPY.IME)看看它有什么组成(这里一WINDOWS98为例,并假定windows系统安装在c:盘下):

C:/Dumpbin c:/windows/system/winpy.ime

Microsoft (R) COFF Binary File Dumper Version 6.00.8168
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.


Dump of file WINPY.IME

File Type: DLL       //IME 实际为dll程序

Section contains the following exports for WINPY.ime

0 characteristics
34A37323 time date stamp Fri Dec 26 17:04:35 1997
0.00 version
1 ordinal base
19 number of functions //共有19个函数
19 number of names     // 对应19个名称 

ordinal hint RVA name

1 0 0000A010 CandWndProc  //"选择汉字窗口"注册函数
2 1 0000E750 CompWndProc  //"输入编码窗口"注册函数
3 2 0000FB50 ImeConfigure  //配置当前ime参数函数 
4 3 0000FEC0 ImeConversionList//将字符或字符串转换成目标字符
5 4 0000FFA0 ImeDestroy   //退出当前使用的IME
6 5 000030D0 ImeEnumRegisterWord
7 6 0000FFB0 ImeEscape //应用软件访问输入法的接口函数.
8 7 00003080 ImeGetRegisterWordStyle
9 8 0000E9A0 ImeInquire      //启动并初始化当前IME输入法
10 9 0000A800 ImeProcessKey    //IME输入键盘事件管理函数
11 A 00002C20 ImeRegisterWord //向输入法字典注册字符串
12 B 000109A0 ImeSelect //启动当前IME输入法
13 C 000109E0 ImeSetActiveContext //设置当前的输入处于活动状态.
14 D 0000C850 ImeSetCompositionString 由应用程序设置输入法编码
15 E 0000AEE0 ImeToAsciiEx    //将输入的键盘事件转换为汉字编码事件
16 F 00002F40 ImeUnregisterWord //删除被注册的字符串.
17 10 0000CA90 NotifyIME   //IME事件管理函数
18 11 00005160 StatusWndProc //状态窗口注册函数
19 12 00002350 UIWndProc   //用户界面接口函数

Summary

5000 .ShareDa
7000 .data
2000 .idata
1000 .rdata
3000 .reloc
5000 .rsrc
2000 .sgroup
18000 .text


从上述可以看出,IME程序共有19个出口函数组成,每一个函数都有特定的格式,它们担负着与windows 系统传递信息的作用,这些函数是供Windows系统调用的。

三、输入法的函数简介

下面我们将介绍上述各个函数的功能及接口格式。

1. BOOL ImeInquire( //初始化IME
LPIMEINFO lpIMEInfo, //用于初始化该输入法的结构地址
LPTSTR lpszWndClass, //当前输入法的名称
LPCTSTR或者dword lpszData //系统信息,9X系列值为0,NT/2000下有实际值
)

如果该函数初始化成功,返回TURE,否则为FALSE

用户应该搞清楚IMEINFO结构,特关系着你设计的输入法是否成功.有关该结构请看"结构"一章.

2.DWORD IMEConversionList( // 将某字符或字符串转换成目标字符串
HIMC hIMC, // 与当前输入法相关的应用程序句柄
LPCTSTRlpSrc, // 要转换的字符串 (也可能是结果串,可由uFlag指定)
LPCANDIDATELIST lpDst, /// 转换后的字符串(也可能是源串,可由uFlag指定)
DWORD dwBufLen, //转换后有几个字符
UINT uFlag //指定结果的存放位置
)

如果成功,返回转换后的字符串长度

3.BOOL ImeConfigure( //用户设置输入法接口
HKL hKL, //当前输入法句柄
HWND hWnd, //配置窗口的父窗口
DWORD dwMode, //配置什么
LPVOID lpData //用户设置的数据
)

该函数的功能是提供给输入法使用者一个可以更改某些隐含设置的能力.

如果你用过别人的输入法,其中的"配置输入法..."功能既是也!

对于一个初写输入法的人,可以不予理它.

4.BOOL ImeDestroy( //关闭当前输入法
UINT uReserved //无用 (0)
)

成功返回TURE,否则为FALSE

5.LRESULT ImeEscape( //用户软件访问输入法内部信息的接口
HIMC hIMC, //当前的应用程序句柄
UINT uEscape, //设置函数功能

//=IME_ESC_QUERY _SUPPORT

//=IME_ESC_RESERVED_LAST IME_ESC_RESERVED_FIRST

//=IME_ESC_PRIVATE_FIRST IME_ESC_PRIVATE_LAST

//=IME_ESC_SEQUENCE_TO_ INTERNAL

//=IME_ESC_GET_EUDC_ DICTIONARY

//=IME_ESC_SET_EUDC_ DICTIONARY

//=IME_ESC_MAX_KEY

//=IME_ESC_IME_NAME

//=IME_ESC_SYNC_HOTKEY

//=IME_ESC_HANJA_MODE

//=IME_ESC_GETHELPFILENAME(只适应 Windows 98和Windows 2000)

//=IME_ESC_PRIVATE_HOTKEY(w95下不可用)

LPVOID lpData //当前功能所需的数据
)

如果失败,返回0,否则有个功能决定

有时,人们可以用此函数怀区输入法的名称、帮助文件名称等。当然,我们可以不提供这些功能。

 

6、BOOL ImeSetActiveContext( //激活或搁置当前的输入法
HIMC hIMC, //当前用户程序句柄
BOOL fFlag //激活或搁置:=TRUE 激活 =FALSE 搁置
)

成功返回TRUE,否则为FALSE

7、BOOL ImeProcessKey( //处理应用程序传入的所有击键事件,监测是否是当前输入法所需的
HIMC hIMC, //应用程序句柄
UINT uVirKey, //需处理的虚键
DWORD lParam, //击键消息参数
CONST LPBYTE lpbKeyState //当前键盘状态(256字节)
)

如果此键是该输入法需要的,则返回TRUE,否则为FALSE

只有返回true的击键,IME才去处理

8、BOOL NotifyIME( //输入法选择窗口状态管理函数:
HIMC hIMC, //当前的应用程序句柄
DWORD dwAction, //状态值
DWORD dwIndex, //与状态值有关的序号
DWORD dwValue //与状态值有关的值
)

状态值说明:

=NI_OPENCANDIDATE 打开编码选择窗口

=NI_CLOSECANDIDATE 关闭当前的编码选择窗

=NI_SELECTCANDIDATESTR 选摘编码

此时:dwIndex 被选择的编码列表序号.

dwValue 被选中的编码在当前的编码列表中的序号

=NI_CHANGECANDIDATELIST 改变当前的编码列表(按pageup等键操作)

此时:dwIndex 被选择的编码列表序号.

dwValue 不用

=NI_SE
IMETool 已经推出有几年了,因为我一向比较懒,没有写过必要的说明,至今有许多朋友不能正确使用它功能(看起来是我设计得比较烂,让人看不明白 )。下面我就几个常见问题做些说明。 1、问:Windows 系统本身就自带输入法管理功能,要 IMETool 何用? 答: ⑴系统自带输入法管理功能无法调整各输入法顺序,而 IMETool 可以实时调整。 ⑵系统自带输入法管理功能只能设置 Ctrl + Alt + 1 之类有限的热键,且有时无法恢复初始设置,删除输入法时无法自动将其热键一并删除。IMETool 大大突破了热键设置局限性,可以实现 1092 种不同的热键组合。这是 IMETool 独一无二的功能。 ⑶系统自带输入法管理功能没有从注册表删除输入法功能。 ⑷另外 IMETool 还支持丰富的命令行参数和脚本,可以通过命令行完成图形界面中的所有功能,非常灵活方便。 2、问:启动系统后总是会默认打开某一输入法,如何才能将其关闭? 答:在 IMETool 的输入法列表中,处在第一位的输入法即为默认输入法。如图一中①处,将“中文 (简体) – 美式键盘”设在第一位,系统启动时就不会再自动打开某输入法了。 3、问:如何才能用一个热键(如 Ctrl + 空格)快速地打开/关闭我最常用的输入法? 答:大家知道,默认的打开/关闭输入法热键是“Ctrl + 空格”,它其实就是来回切换位于输入法列表中前两位的输入法。所以只须将最常用的输入法排在列表中第二位即可,比如我最常用极点五笔输入法,就将其放在图一中②处。 4、问:如何快速打开某输入法的属性或热键对话框? 答:在输入法列表“名称”一列上双击,即可快速打开输入法属性设置对话框;即热键一列双击则打开热键设置对话框。 5、问:“键盘”按钮有何作用? 答:此功能极少用到。一些中文输入法在安装后使用系统默认的英文键盘定义,对于使用其它国别键盘的用户,会产生键位错误的情况。此时可使用 IMETool 的键盘布局重定义功能将其设置为正确的国别即可。注意:在点击“键盘”按钮打开的对话框中选择“确定”后,会立即修改注册表中的相应项目,请谨慎使用。 6、问:输入法风格中的“输入法指示器”和“高级文字服务”有什么区别? 答:在 Office XP 未出现之前,Win 9X 和 Windows 2000 中一直使用输入法指示器(internat.exe),即在任务栏系统托盘区中显示输入法列表的蓝色 En 或 CH 图标(不同配色方案下图标颜色可能不同)。 从 Office XP 开始,微软使用高级文字服务(ctfmon.exe)来代替输入法指示器,其特点是其输入法列表可在屏幕上任意移动,并可缩小至任务栏(但不在系统托盘区)。在 Windows XP/2003 系统中已经用高级文字服务完全取代了输入法指示器,所以要想使用输入法指示器,只能从 Windows 2000 系统中复制出 Internat.exe 和 indicdll.dll(前者必须的库文件)来使用。 7、问:调整输入法顺序为何有时不起作用? 答:此功能主要适用于使用输入法指示器的情况,在高级文字服务模式下,系统往往会记住你上次使用的输入法,并动态调整。另外在 Win95/NT 系统下,调整顺序需要重启系统方可生效。 8、问:使用 IMETool 进行一些设置后,默认的 Ctrl + Shift 切换输入法热键不能用了? 答:这是反映最多的一个问题,在此详细说明一下。 在高级文字服务模式下(ctfmon.exe),有“切换输入语言”和“切换键盘布局”两种热键,两者的热键必须为Ctrl + Shift 和 Alt + Shift 中的一个,即如果前者的热键是 Ctrl + Shift,后者的热键就必须是 Alt + Shift,其设置保存在注册表中。“切换输入语言”是指即在安装的不同语言间切换,如中文(中国)、美国英语等。“切换键盘布局”是指切换不同的输入法。 而在输入法指示器模式下(internat.exe),只有切换输入法这一种功能,而其从注册表读取的热键配置正好是高级文字服务模式下的“切换输入语言”的配置。由此可知,同样的注册表配置,高级文字服务和输入法指示器两种模式下切换输入法的热键正好是 相反的。 所以这个问题并不是 Ctrl + Shift 热键不能用了,而是默认变成了 Alt + Shift,可在设置中改回。 注:在 2.6.5 版本中,已经解决了这个问题,无须再手工切换。 9、问:在使用 IMETool 后,有时输入法的指示条会消失。 答:在 IMETool 的其它设置中,有一个打开/关闭输入法指示条的选项,是调用了一个 API 函数来实现的。不知何故,其只对当前打开的输入法有效,对其它输入法可能会起到相反的作用,不过在系统重启后会恢复正常。此问题有待于以后研究解决。 建议:在使用 IMETool 之前,关闭所有打开的输入法,因为已运行的不同程序下可能会打开不同的输入法,所以要逐个关闭。 10、问:IMETool 的修复功能有哪些,为何在界面中找不到? 答:IMETool 可以修复一些常见的输入法混乱情况:如: ⑴某输入法已经卸载,但仍在输入法列表中残留了条目。 ⑵某输入法已经卸载,但其先前设置的热键并没有取消。 ⑶高级文字服务模式下,将输入法列表条最小化后,任务栏上不出现语言栏。 ⑷2000/XP 提示“检测到不兼容的键盘驱动程序。该对话框已被停用。”,并且无法通过控制面板添加删除输入法。 以上修复过程完全是自动进行的,不需要人工干预,故没有在界面中设计。 11、问:软件包里附带的 internat.exe 和 indicdll.dll 文件有何作用? 答:这两个文件是从Windows 2000 简体中文专业版中提取的,并做过一些修改。Windows XP/2003 若想使用“输入法指示器”风格工作时需要将这两个文件复制到系统文件夹下使用。建议将 imetool.exe 文件也复制到系统文件夹下,这样就可以从输入法指示器右键属性中直接调用 IMETool 了。 12、问:如何卸载 IMETool? 答:IMETool 只有一个主文件,无须安装,自然也无须卸载,直接删除即可。 13、问:一些杀毒软件报 imetool.exe 为“病毒”。 答:IMETool 使用 upx 压缩过,一些比较敏感的杀毒软件会报其为加壳程序(注意不是报病毒!),从 2.8.1 版开始,不再使用 upx 压缩主程序。 Silence 2009.8.14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值