本文重点讲解输入如何去自己处理输入法的问题,由于最近在写一个程序,发现这个问题是写windows程序一段时间后,很多人都会遇到的问题,所以简单尝试了一下有关的几个方法,也不知道对不对,先这样做一个初级的版本出来,目前只能显示和选词空间,而且UI为了方便使用了最丑陋的windows原始的UI,不过后期我会改进的呵呵,由于有人希望我第一时间把这个代码和方法公布出来,所以我就先把第一个版本草草的给大家展示一下,不好的地方希望大家一起提高。
废话先说这么多,我想大家既然都搜到这篇名不经传的小文章了,想必都已经知道IMM这个东西了,不过不知道也不要紧,第一步先加入Imm32.lib;这个库文件,不知道如何加入的回家面壁去。
下面开始介绍下几个消息;
我想关于输入法的第一个消息就是WM_INPUTLANGCHANGE这个消息了,这个消息当我们的输入的语言改变的时候会发出该消息。
然后介绍一个WM_IME_STARTCOMPOSITION:这个是开始接收到键盘键入并开始将按键按照一定的规则转化成字符编码。
当然与之对应的一个是WM_IME_ENDCOMPOSITION:不用说这个是结束转化的一个消息。
重中之重是在这两个消息中间的状态消息WM_IME_COMPOSITION:这个消息是我们按键要获取输出字符,和输入按键的一个消息。
最重要的角色总是最后出场,最后介绍下WM_IME_NOTIFY:这个是我们关注输入法的全角半角,中文英文标点,翻页,进入选字表等操作的地方。
这个是要处理的几个消息。
下面我开始说明一些我们要用的函数:
//获取当前激活的键盘布局
HKL hKL = GetKeyboardLayout( 0 );
//当前激活的键盘布局是否有输入法窗口
ImmIsIME(hKL)
//获取环境
HIMC hIMC = ImmGetContext(d_hWnd);
//释放环境
ImmReleaseContext(d_hWnd,hIMC);
//获取输入法的名称
ImmEscapeW(hKL,hIMC,IME_ESC_IME_NAME,d_imeName
//更新各个输入法内部状态
DWORD dwConversion, dwSentence;
ImmGetConversionStatus(hIMC,&dwConversion,&dwSentence);
CANDIDATELIST 这个结构是存储字符列表的东西,详细的介绍可以参考msdn。
//获取缓冲区的数据
ImmGetCandidateListW(hIMC,0,(LPCANDIDATELIST)d_bufCandidate,buflen);
CANDIDATELIST *pList = (CANDIDATELIST*)d_bufCandidate;
ImmGetCompositionStringW这个函数有多个参数,我就懒得说明各个调用是什么意思,大家可以参考
http://msdn.microsoft.com/en-us/library/windows/desktop/dd318164(v=vs.85).aspx
这个是各个参数的说明,嘿嘿,程序员嘛懒是正常的。
当然这篇文章最好配合上我的代码进行测试,在输入的时候只要点击父窗口,打开输入法就可以了。子窗口是显示输入法中选字和键盘按键输入的。附上截图:
当然,犀利一点的人会发现,这岂不是可以把搜狗词的排序通过这种办法弄到,在做预先输入模型的时候是一个很好的选择,这不是本程序的本意。本程序只是交给大家如何在无法显示输入法选词窗口的时候使用他。
在此郑重声明,凡是使用此代码乱搞的人,一切本人概不负责,以及代码中若有任何bug,或者商业使用导致的任何问题,与本人无关,这个代码纯粹为了教学。若该代码引起了任何问题请按照以下排序的倒序去追究责任:
1.作者
2.使用者
3.csdn编辑
4.csdn管理人员
5.发现问题的人
6. 准备提起诉讼者。
好了就写这么多吧!最后的最后附上资源地址:
http://download.youkuaiyun.com/detail/xueyunf/5599975
最后来张经典截图:
哈哈哈哈哈哈,好了时间差不多了,就到这里了!