浅析输入法原理

       首先我们要知道什么是输入法,我们经常用输入法,但是你发现一个现象没有?,在任务管理器中并没有看到输入法进程。当然了搜狗那种流氓软件除外,说不定正在后台做什么偷偷摸摸的事情,当然要创建进程。输入法的核心文件你找到安装目录就会发现一个后缀是.ime的文件,你用十六进制查看器看看就会发现他其实是一个类似dll的模块,当一个进程打开输入法要输入汉字的时候其实就是载入了这个模块,如下图:

浅析输入法原理_第1张图片

在这个模块里进行文字的接收,处理,发送。

一.Windows 9x系统

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

 

二,windows NT系统

       这个是重点。

       Windows XP系统下的输入法和9x系统的输入法有很大区别,对输入法的处理完全不同。这个是我花了一下午和一位论坛好友交流的结果,说是交流,其实就是他单向传授与我,呵呵。废话不多说,我们开始。

先看一段程序

while((r=GetMessageW(&msg,0,0,0))!=-1)

{

if(r==0)break;

TranslateMessage(&msg);

     DispatchMessageW(&msg);

}

       这是一个消息循环,直到r等于0,表示有WM_QUIT,r=-1表示出错,是系统从消息队列中取消息的一般过程。那么输入法是怎么回事呢?

       一般情况下GetMessage得到WM_KEYDOWN的wParam是虚拟键码,如果我们开了输入法,WM_KEYDOWN的wParam虚拟码是VK_PROCESSKEY,TranslateMessage对一般的虚拟键码是产生WM_CHAR,WM_SYSCHAR之类的,但是当TranslateMessage遇到了VK_PROCESSKEY,就会有特殊处理。这时候TranslateMessage就会把控制权交给DefWindowProc这个缺省的消息处理例程,DefWindowProc再通知输入法程序的窗口,把那些候选的显示出来,当你的你输入法将接受到的虚拟码做一系列转换以后合成相应的汉字,输入法再将合成好的WM_CHAR用PostMess插入消息队列,Edit控件接受WM_CHAR显示字符。

       如果你没有开输入法WM_CHAR直接由 TranslateMessage产生。

流程图如下:

 

浅析输入法原理_第2张图片

有好东西不忘和大家分享一下,呵呵。

这种说法肯定有许多错误和不足,毕竟我是菜鸟,欢迎指正。

最后一句,菜鸟言论,仅供娱乐。

你可能感兴趣的:(windows,娱乐,input,dll,输入法,搜狗)