`

IME编程心得

阅读更多

 

IME编程心得

一、基础知识:(不断补充) 

1.输入法管理器(IMM) 

2.输入法编程器(IME) 

3.输入上下文(IC) 

4.应用程序(App) 

 

二、IMM-IME结构的基本工作过程及特点 

用户键盘消息->系统通过IMM传递给与当前线程对应的IME->IME根据输入的消息和输入上下文中记录的数据,将用户的键盘动作转换成结果串->以字串消息的形式返回给IMM->放到应用程序窗口的消息队列中。 

 

三、IME的构成 

1.IME转换接口(IME conversion interface) 

2.IME用户接口(IME user interface) 

由用户实现的一组窗口,这些窗口用来接收和处理由IMM发来的输入消息,提供与用户交互的界面.由下面的窗口组成: 

1)缺省的IME窗口(Default IME window) 

2)用户接口窗口(UI interface) 

3)用户接口窗口的组件:状态窗口(status window);编码窗口(compsition window);候选窗口(candidate window). 

4)软键盘和系统菜单/图标等 

 

四、IME的实现 

1.IME转换接口的实现 

这些接口函数在供管理器在适当的时候调用.这些函数并非每个都要进行自己的处理,大部分保留一个空函数即可,但没有却不可.系统默认是要调用的,找不到就不行.有以下函数: 

1)ImeInquire 

2)ImeConfigure 

3)ImeProcessKey 

4)ImeToAsciiEx 

5)ImeSelect 

6)ImeSetActiveContext 

7)NotifyIME 

8)ImeDestroy 

9)ImeConversionList 

10)ImeEscape 

11)ImeSetCompsitionString 

12)ImeRegisterWord 

13)ImeUnregisterWord 

14)ImeGetRegisterWordStyle 

15)ImeEnumRegisterWord 

2.IME用户接口的实现 

主要包括用户接口窗口(窗口类和窗口过程),用户界面窗口的组件(状态窗口,编码窗口和候选窗口的窗口类和窗口过程),输入法的配置窗口,软键盘,任务条上的指示器窗口(图标,菜单,工具提示)和输入法热键等. 

1)用户接口窗口:编程中主要是处理由缺省的IME窗口传入的IME消息,当然,并非所有的IME消息都需要给出具体处理(可以看出这是IME编程中的一个原则).如: 

WM_IME_COMPOSITION 

WM_IME_STARTCOMPSITION/WM_IME_ENDCOMPOSITION 

WM_IME_SELECT 

WM_IME_NOTIFY 

WM_IME_CHAR 

 

五、具体实现步骤: 

IME实质上是一个DLL实现,由系统调用。而这个DLL则分别实现了系统要调用的功能函数。所以有些函数虽然不 

 

做什么事情,但是必需挂上一个空壳。否则调用出错。 

1.DLLMain()的架构 

1)进入进程 

DLL_PROCESS_ATTACH事件中,注册用户接口窗口类及其组件的窗口类:使用RegisterClassEx()完成此注册过程 

 

。设置类名字段(lpszClassName)为用户接口窗口类类名(包括结束标志'\0'在内最长可达16字符),在类风格 

 

(style)字段中必须包括CS_IME风格。设置附加内存大小(cbWndExtra)。 

 

 

2)退出进程 

注销上述与输入法编辑器有关的窗口类,进行全局性的清理工作。 

 

2.打开/关闭输入法编辑器时进行的初始化操作 

1)用户接口窗口是由缺省的IME窗口在接到WM_IME_SELECT消息时创建的。输入法管理器通过调用ImeRequire接 

 

口函数获取输入法编辑器的相关信息(属性、用户接口窗口类,可选项),据此进行输入法编辑器的初始化工作 

 

,创建输入法编辑器的用户接口窗口。所以ImeRequire是输入法转换接口必须实现的第一个函数。 

2)在用户接口窗口被创建后,可以进行输入法编辑器全局性的一些初始化工作,比如申请自己的私有内存,建 

 

立私有上下文等,这些工作一般在处理WM_IME_SELECT消息或在接口函数ImeSelect中进行,也可以在窗口过程 

 

处理WM_CREATE消息时进行。 

 

3.进入进程后: 

1)初始化词库 

2)创建字体 

3)注册窗口类 

 

4.在UI窗口建立后,建立写作窗口和候选窗口 

各个窗口下进行各自的消息函数处理 

在这里有疑问:UI窗口是什么?UI窗口处理了IME的好多消息.--解答参看<<基于IMM-IME输入法接口的实现方法>> 

下一个任务:看这个论文 

UI窗口是对用户不可见的,但是它是所有用户界面窗口的组件窗口的父窗口,是全部组件窗口的管理者. 

 

5.构建框架的问题 

在projects-settings-c/c++-catagory:prepossessor:additional include directories:./ 

避免添加系统默认的头文件 

 

6.注意的细节问题: 

1)global.c中的#pragma data_seg(".zhenhuadic"),应详细了解其作用,其与Czh.def中的定义有相关联的地方.(对我们的工程名Czh来说) 

2)freepy.exp : warning LNK4070: /OUT:Czh.ime directive in .EXP differs from output filename 

;C:\WINDOWS\system32\freepy.ime; ignoring directive 

对于这个BUILD中的错误,关联之处在于Czh.def中定义了lib的输出名为Czh,要求这个lib的输出名与Output file name freepy相同. 

3)如果.ime名和上述2)中说的问题没有的话,且freepy.h(原工程)中的#define FREEPYFILENAME   _T("freepy.ime")定义正确,则在HZfreepy.h中改变以下几个文件名与C:\windows\system32\(window xp系统下)下的相关文件名相同则可: 

freepy.tab--字库 

freepysys.dic--系统词库 

freepyusr.dic--用户词库 

4)在ImeSelect的函数中,有个注册表键值的处理与工程有关联 

5)有四条消息的遗漏: 

imm:NotifyIME 

imm:NotifyIME:NI_CONTEXTUPDATED 

imm:NotifyIME:NI_CONTEXTUPDATED:IMC_SETCOMPOSITIONWINDOW 

UIWnd 

UIWnd:WM_IME_NOTIFY 

UIWnd:WM_IME_NOTIFY:IMN_SETCOMPOSITIONWINDOW 

UIWnd:3 

UIWnd 

UIWnd:WM_IME_NOTIFY 

UIWnd:WM_IME_NOTIFY:IMN_SETOPENSTATUS 

UIWnd:3 

UIWnd 

UIWnd:WM_IME_NOTIFY 

UIWnd:WM_IME_NOTIFY:IMN_SETCONVERSIONMODE 

UIWnd:3 

UIWnd 

UIWnd:WM_IME_NOTIFY 

UIWnd:WM_IME_NOTIFY:IMN_SETSENTENCEMODE 

在开发过程中,初始化的四条消息缺漏.考察:与代码有关还是与安装有关? 

自己开发安装是手动完成的,即通过直接改注册表来实现的.为了检测,我将自己的开发代码工程作如下变动: 

----settings-output file name\freepy.ime 

----字库词库名不变,但存在system32目录下 

只要这样,就可以出现了上述的消息.这时还与ImeSelect下的注册表项读取无关、与czh.h中的文件名定义无关、与czh.def中的lib定义无关。但是在调试时,选择输入法时却可将本工程的图标之类的调出来。这样看来,只是无法输入文字(还没实现相关的功能),目前的结论是:四个消息的遗漏与安装有关。 

7)制作安装程序:仿照freepy的安装程序,制作一个自己的安装程序,然后重新安装,安装之后要进行更新,也就是到输入法的添加删除界面进行删除然后再添加进来,注销系统之后,就可以用了. 

这样安装的结果是:多出了上面的第二条消息,其它仍然不行.--哪究竟与谁有关系?是不是与代码有关? 

只要将,settings中的作改变就可以实现消息补充.这与什么有关系? 

8)再重新安装一次,这次重装是这样的: 

--HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts\下对应的振华输入法子项都删除 

--HKEY_CURRENT_USER\Keyboard Layout\preload 下对应的本输入法的子项删除 

--HKEY_LOCAL_MACHINE\software\下的czhhua删除. 

这样重装之后,消息出现. 

 

7.流程分析: 

1)字库的装载 

这个工作是在程序进入DLL的开始部分就执行的,将字典内容保存到存储区,以备将COMPSTR转成汉字时调用存储区. 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics