IMM(Input Method Manager)只在安装了亚洲语言包之后才能使用。
通过调用GetSystemMetrics(SM_IMMENABLED)知道IMM是否使能。
一共由三部分组成:
status window 输入法状态栏 表示正在处于中文输入状态可以知道是什么输入法
composition window 当你开始输入字母的时候,显示字母
candidates window 紧靠在composition window下面,指示可能的字符组合(就是中文备选)
最终中文通过WM_IME_CHAR消息发送到对应的程序。
IME Window Class是系统预定义的窗口类。一般用于IME-aware程序定制输入法只用。
当一个窗口激活时,操作系统发送WM_IME_SETCONTEXT到程序。如果是IME-unaware程序,程序会把它传递给
DefWindowProc函数,然后由其发送给缺省的输入法。IME-aware程序可能会自行处理该消息。
发送WM_IME_CONTROL消息可以改变composition window
如果输入新字母时,IME会发送WM_IME_COMPOSITION通知程序。
如果设置有变化时,IME会发送WM_IME_NOTIFY。
输入上下文是IME维护的内部数据结构。缺省,操作系统为每个线程一个分配一个默认输入上下文,所以默认输入上下文是线程内窗口的共享资源。
通过ImmGetContext得到特定窗口的输入上下文。通过ImmReleaseContext来释放。
通过ImmCreateContext和ImmAssociateContext可以创建和应用新的输入上下文。
在程序退出之前,必须调用ImmDestroyContext销毁自建的输入上下文。
Composition String就是composition window中显示的字符串。Composition String由一个或者多个分类组成。
分类就是最后能翻译成目标字符的最小集合(比如chuntian对应春天)
通过ImmGetCompositionString and ImmSetCompositionString两个函数,程序可以得到或者设置当前的Composition String以及其相关的属性,比如分类信息,光标信息。
edit control支持两条消息EM_GETIMESTATUS and EM_SETIMESTATUS来改变IME的状态。
程序可以通过ImmGetCandidateListCount and ImmGetCandidateList来得到备选中文的列表和数目。
通过ImmSimulateHotKey 可以设置快捷键。
WM_IME_SETCONTEXT
WM_IME_STARTCOMPOSITION
WM_IME_ENDCOMPOSITION
WM_IME_COMPOSITION
WM_IME_REQUEST
下面我们来实现一个输入法框架
#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <imm.h>#include <tchar.h>#pragma comment(lib,"imm32.lib")//窗口类名#define CLSNAME_UI _T("DLLISUI") //UI#define CS_INPUTSTAR (CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS)#pragma data_seg("mysechx")DWORD CallBackData1=0;DWORD CallBackData2=0;DWORD CallBackData3=0;DWORD OnloadDllWhenExit=1; // 当输入法退出时是否卸载客户DLL 0-是,1-否DWORD LoadNextWhenActive=1; // 当本输入法激活时,是否自动打开下一个输入法 0-否,1-是char g_IMEDLLString[802]="";#pragma data_seg()typedef DWORD (CALLBACK * RUNDLLHOSTCALLBACK)(DWORD calldata1, DWORD calldata2,DWORD calldata3);HMODULE CilentDLL=NULL;RUNDLLHOSTCALLBACK RunDllCallBackX=NULL;// 先定义好各种函数BOOL ImeClass_Register(HINSTANCE hInstance);void ImeClass_Unregister(HINSTANCE hInstance);LRESULT WINAPI UIWndProc(HWND hUIWnd,UINT message,WPARAM wParam,LPARAM lParam);BOOL MyGenerateMessage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAM lParam);void MyLoadCilentDLLFun(){ MessageBox(NULL,"HELLO","HELLO",MB_OK);}BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved){ switch(fdwReason) {