Win下的输入法(IME)编程(1)

为了防止原数据丢失,得此做一个备份
原文地址:https://blog.csdn.net/pkfish/article/details/7339890 作者:pkfish

·win下的输入法编程方法

    在win下编写输入法主要可以采用外挂式和IME方式两种:

    ·外挂式的实现核心是通过键盘钩子对输入进行拦截,再把要输出的内容传送给处于活动状态的编辑窗口。

    ·IME方式则是使用系统提供的IME(Input Method Editor)接口实现输入法。

    头一种方法自己并未接触过,但使用钩子技术在兼容性上来说总是有点不足的(遇上防钩子的程序,输入法就没辙了),再者,把要输出的内容传送给处于活动状态的输入焦点处并不总能成功(对win下的api了解不多,这里或许有误)。既然系统已经为我们编写输入法专门弄了个IME出来,那当然还是直接用系统的好些啦。

·IME介绍

    IME的实现原理可用下图简单的表述:

键盘事件  应用程序

↓     ↑

Windows的USER.EXE

↓ ↑

输入法管理器(IME)

↓ ↑

输入法


    当当前活动窗口开启了输入法后,键盘事件就会通过系统进程USER.exe转交给IME处理,IME再转告给当前输入法,输入法处理完后把处理结果告知IME,IME根据这个处理结果决定反馈给USER.exe,然后再反馈给当前应用程序的活动窗口。

    基于IME开发的输入法文件后缀为“ime”,但实际上是一个dll文件。这个dll文件类似于IME的一个插件存在,实现了IME要求的十几个接口函数。实际上,当IME收到USER.exe发来的键盘事件时,IME就会调用当前启动的输入法中某些IME接口函数,根据这些函数的返回值,IME可以确定输入法是否打算处理当前的键盘输入(选择不处理的情况下该键盘事件将会送去给应用程序自己去处理,否则应用程序不会收到该键盘事件),或把输入法要求输出的内容输出到应用程序中。

·系统对输入法信息的保存

    IME输入法的信息保存在注册表中,位置有两个:



    ·HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts



    这里保存了所有当前系统已安装的输入法的基本信息,这里要特别说明一下:已安装的输入法并不仅仅是指在语言栏里能直接看到,能用热键切换的输入法,还包括安装了但未在语言栏中启动的那些,这些未启用的输入法可以在语言栏的设置->按[添加]按钮弹出的窗口中找到。

    在这个注册表项下是一堆以英文和数字组成的8位字符串命名的子项(实际应该理解为一个8位的16进制数,为输入法的键盘布局唯一标识号),这里每一个子项代表的就是一个已安装的输入法。而这些子项的字符串的后4位代表了该输入法所属的语言,这个值具体的意义可从“HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layout\\DosKeybCodes”项里面的值里查到,而前4位则仅表示一个安装序号,以保证每个输入法项的这个8位字符串都是唯一的,每当有新的输入法通过系统提供的方法安装进来,系统就会找出与要安装的输入法同一语言的输入法中最大使用到的安装序号,新安装的输入法则在这个安装序号基础上+1,如果安装是完全通过自行写入注册表的方式完成的,则只要保证字符串后4位值满足要求且整个8位字符串值惟一也行,不过还是建议使用系统提供的方法安装(具体操作文章稍后的地方有讲)。

    举个例子,假如当前系统刚通过系统提供的方法安装了一个新输入法,其安装好后的输入法项为“00060804”,则根据后4位“0804”可以查到,这个输入法的语言是属于中文的,而前4位“0006”则为其安装序号,假设现在有一个新的中文输入法要通过系统提供的方法安装进来,则这个新输入法安装完后所分配的项应该为“00070804”。

在对于非系统的输入法项里面都写有三个必定存在的键:

Ime File:该输入法对应的ime文件文件名。系统从system32目录(win9x下为相对于system目录)下读入该文件;

Layout File:键盘布局文件,一般指向某个系统文件(自己也没搞清楚是怎么回事[-.-]);

Layout Text:在语言栏设置中选择要操作的输入法(启用/取消启用)时看到的输入法名称。

    另外也有输入法项里存在Layout Display Name和Layout Id这些键,但没研究过其意义。



    ·HKEY_CURRENT_USER\\Keyboard Layout\\Preload



    这个位置保存的是当前用户启用的输入法的列表,也即当前用户可在语言栏中切换到的输入法都可以在这里看到。每个启用的输入法占一个键,其键名代表了该输入法的启用顺序,值内容则为该输入法安装后的8位字符串标识。

留下评论