2021SC@SDUSC
从这一篇开始分析WeaselIME包的关键代码。
在这里我们先简单了解一下IME。
IME概述
IME是指Input Method Editors输入法编辑器,它是一种专门的应用程序, 用来输入代表东亚地区书面语言文字的不同字符。
一个IMF结构中包含三个主要的部分:
- input method manager(IMM):管理各部分的交互。它是一个客户端API,存在于各个应用程序的context中,用来沟通管理所有进程间交互的全局系统服务。
- input method(IME):实现一个允许用户生成文本的独立交互模块。系统绑定一个当前的输入法。使其创建和生成,决定输入法何时隐藏或者显示它的UI。同一时间只能有一个IME运行。
- client application:通过输入法管理器控制输入焦点和IME的状态。一次只能有一个 客户端使用IME。
IME工作原理
结合IME转换接口进行简单说明:
-
输入法初始化:
ImeInquire : 刚选择某输入法时,IMM调用此函数,获得输入法相关信息,并根据用户界面类UICLASSNAME,自动创建用户界面。
ImeSelect : 打开或关闭输入法时被调用,在此函数中对输入法上下文进行初始化或恢复释放 -
IMM将键盘消息传递给IME:
IMM 通过IME 转换接口ImeProcessKey 将键盘消息发动到IME此函数对键盘消息进行筛选处理,用以判断此消息是发送给IME 还是直接发送给应用程序。如果返回TRUE 则发送给IME 否则,直接发送给应用程序 -
IME将键盘消息转换为相应汉字:
IME 通过ImeToAsciiEx 函数来处理ImeProcessKey发送过来的键盘消息,并最终转换为输出的结果串 -
IME 将汉字以字符消息的形式返回给IMM:
IME将使用WM_IME_CHAR或 WM_IME_COMPOSITION/GCS_RESULT消息把组合好的字符发送给窗体中的应用程序。如果应用程序没有处理这些消息,DefWindowProc函数会把它们翻译成一条或多条WM_CHAR消息
IME命令
命令格式:
ime< command >
命令列表:
命令 | 功能 | 实现方法 |
---|---|---|
list | 获取所有输入法 | getInputMethodList |
enable ID | 设置输入法可用 | setInputMethodEnabled |
disable ID | 设置输入法不可用 | setInputMethodENabled |
set ID | 设置默认输入法 | setInputMethod |
IME示例
MakeResultString 将转换结果保存在输入上下文中将GenerateMessage 发送WM_IME_COMPOSITION/GCS_RESULT消息给应用程序,从而使得应用程序获得结果串。
BOOL MakeResultString(BOOL fFlag)
{
HIMC hIMC;
LPINPUTCONTEXT lpIMC = NULL;
LPCOMPOSITIONSTRING lpIMECompStr = NULL;
LPTSTR lpResultStr = NULL;
GENEMSG GnMsg