浅析Windows程序输入法工作原理
输入法程序也是一个进程,但是我们在任务管理器中却找不到该进程,找到输入法的安装目录会发现一个后缀是.ime的文件,就是一个dll的模块,当一个进程打开输入法要输入汉字的时候其实是加载了这个模块。
一,输入法结构介绍
1),IMM-输入法管理器
是windows的内在组成部分,是应用程序与IME之间的接口,用来管理每一个IME,维护IME与应用程序的通信。
2),IME-输入法编辑器
用来从系统中接收键盘信息,经过输入法所定义的转换产生汉字,相当于转换引擎,由系统提供。
3),Input context-输入上下文
是一个内置结构,由IME来维护,它包含了IME窗口所使用的有关IME状态的信息。默认情况下,系统会为每一个线程创建并指定一个输入上下文。在线程中,这个默认的输入上下文是一个共享资源,并且将会与每个新建窗口关联,供线程中的所有窗口共享。
从用户敲击键盘进行输入到应用程序接收到字符输入消息,大概流程如下:
二,Windows消息循环捕捉键盘消息
windows程序的消息循环为:
while ((r = GetMessageW(&msg, 0, 0, 0)) != -1)
{
if (r == 0)break;
TranslateMessage(&msg); //消息预处理
DispatchMessageW(&msg); //分发消息
}
一般情况下GetMessage得到WM_KEYDOWN的wParam是虚拟键码,如果我们开了输入法,即中文输入法下,WM_KEYDOWN的wParam虚拟码是VK_PROCESSKEY,TranslateMessage对一般的虚拟键码是产生WM_CHAR,WM_SYSCHAR之类的,但是当TranslateMessage遇到了VK_PROCESSKEY,就会有特殊处理。这时候TranslateMessage就会把控制权交给DefWindowProc这个缺省的消息处理例程,在DefWindowProc中根据中文字符按下收到的WM_IME_COMPOSITION消息,产生一个WM_IME_CHAR,然后再发送给本地线程,实际上也就是以WM_IME_CHAR为参数,递归调用了一次WINPROC,在这次调用的WINPROC中产生WM_CHAR。
如果你没有开输入法WM_CHAR直接由 TranslateMessage产生。备注:TranslateMessage在此前会进行一些键盘消息预处理操作,从WM_KEYDOWN、WM_SYSKEYDOWN中产生‘字符消息’(WM_CHAR、WM_DEADCHAR、WM_SYSCHAR或WM_SYSDEADCHAR)。典型的一组击键消息过程为WM_KEYDOWN——WM_CHAR——WM_KEYUP
三,总结
将上面的两点结合在一起,就是整个输入法的处理流程:IMM通过IME的转换接口将键盘消息发送到IME,此函数对键盘消息进行筛选处理,用以判断该消息是否是发送给IME还是直接发送给应用程序。IME接收到键盘消息后,进行处理,并最终转换为输出的字符串。 IME使用WM_IME_COMPOSITION/GCS_RESULT或WM_IME_CHAR消息把组合好的字符发送给应用程序,如果应用程序没有处理这些消息,DefWindowProc函数会把它们翻译成一条或多条WM_CHAR消息。