IME 接口函数

ImeConversionList:根据输入上下文的有关内容,将一个字符或者字符串转换成远东字符结果列表或者另外一个字符串。
此函数的做用是在输入串和结果串之间进行变换以便于进行从新转换,因此在此函数中不该该产生任何相关的输入法编辑器消息;程序员

 


BOOL WINAPI ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData)
这是最后一个须要注意的接口,在显示输入法属性配置时会Windows会调用这个接口.
#ImeConfigure:此接口函数将在用户经过控制面板或系统图标设置输入法属性时被输入法管理器调用。在此函数中能够显示属性设置对话框,供用户配置输入法的可选项;编辑器

 


ImeDestroy:结束输入法编辑器的工做;函数

 


ImeEscape:应用程序经过调用这个函数能够直接访问某个输入法编辑器的特定功能,这些功能一般没法经过其余的IMM函数调用实现。这么作的目的主要是为了支持特定语种的函数或者IME的私有函数;ui

 


/**********************************************************************/
/* ImeInquire() */
/**********************************************************************/
BOOL WINAPI ImeInquire(LPIMEINFO lpImeInfo, LPTSTR lpszWndCls, DWORD dwSystemInfoFlags)
这个函数是除了DllMain后第一个会被win32 IMM调用的函数.
IMM经过调用这个函数知道你的输入法有什么特性. 好比,除了按键消息外,你是否是还想处理键放开的消息.
#ImeInquire:此接口函数在用户选择某个输入法时最早由输入法管理器调用,以得到该输入法的有关信息。函数应返回输入法编辑器的初始化信息,在IMEINFO结构中设置当前输入法的各项属性,以及当前输入法的用户界面窗口类名称;
 编码

 
 
/***********************************************************************/
/*系统调用这个接口来判断IME是否处理当前键盘输入 */
/*HIMC hIMC:输入上下文 */
/*UINT uKey:键值 */
/*LPARAM lKeyData: unknown */
/*CONST LPBYTE lpbKeyState:键盘状态,包含256键的状态 */
/*return : TRUE-IME处理,FALSE-系统处理 */
/*系统则调用ImeToAsciiEx,不然直接将键盘消息发到应用程序 */
/**********************************************************************/
BOOL WINAPI ImeProcessKey(HIMC hIMC,UINT uKey,LPARAM lKeyData,CONST LPBYTE lpbKeyState)
观察注释,您能够看到在个接口是用来判断用户敲击的哪一个键须要处理,哪一个键又应该交给系统本身处理.
若是输入法须要本身处理用户输入的键,则在这个接口中返回true,不然返回false.
#ImeProcessKey:此接口函数由输入法管理器在处理键盘事件时调用。在此函数中对键盘事件进行预处理,根据此函数的返回值,系统肯定对于特定的输入上下文来讲此键盘事件是否应送交输入法编辑器进行处理。若是返回TRUE,
则表示应该先把键盘消息传送到输入法编辑器进行处理,因此输入法管理器会紧接着继续调用ImeToAsciiEx函数;
若是返回FALSE,说明此消息不须要输入法编辑器进行处理,输入法管理器将其直接送到应用程序接口

 

 
/**********************************************************************/
/* ImeSelect() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
BOOL WINAPI ImeSelect(HIMC hIMC,BOOL fSelect)
在这个接口中,系统通知输入法当前是否打开了输入法输入.
通常输入法启动时会调用一次,在一些软件(如EmEditor)中提供打开与关闭输入法的功能就是经过这个接口实现的.
若是打开输入法,通常会在这个接口中作一些数据的初始化工做.
#ImeSelect:此接口函数在用户打开或关闭输入法时被调用。在此函数中对输入法上下文内容进行初始化或恢复释放。在实现某个输入法编辑器的时候,可能须要对输入法上下文中包含的内容项进行扩充,扩充后的输入法上下文称为此输入法的私有上下文。在打开输入法时,函数的fSelect参数为TRUE,须要完成对标准的输入法上下文的扩充工做,申请追加内存,预设各个内容项的初值;在关闭输入法时,fSelect参数为FALSE,须要释放为私有上下文申请的附加资源;事件

 


ImeSetActiveContext:若是在某个窗口中打开了输入法编辑器,那么此接口函数会在应用程序窗口得到或失去输入焦点时被调用。在此函数中能够获取当前的输入法上下文并通知输入法编辑器用户界面窗口组件,令其刷新显示;内存

 


ImeSetCompositionString:根据参数中给出的数据,修改写做字符串。这个函数将向输入法编辑器发送一条WM_IME_COMPOSITION.ci

 


/****************************************************************************************************************/
/* function:应用程序调用这个接口来进行输入上下文的转换,输入法程序在这个接口中转换用户的输入 */
/* UINT uVKey:键值,若是在ImeInquire接口中为fdwProperty设置了属性IME_PROP_KBD_CHAR_FIRST,则高字节是输入键值*/
/* UINT uScanCode:按键的扫描码,有时两个键有一样的键值,这时须要使用uScanCode来区分 */
/* CONST LPBYTE lpbKeyState:键盘状态,包含256键的状态 */
/* LPDWORD lpdwTransKey:消息缓冲区,用来保存IME要发给应用程序的消息,第一个双字是缓冲区能够容纳的最大消息条数 */
/* UINT fuState:Active menu flag(come from msdn) */
/* HIMC hIMC:输入上下文 */
/* return : 返回保存在消息缓冲区lpdwTransKey中的消息个数 */
/****************************************************************************************************************/
UINT WINAPI ImeToAsciiEx (UINT uVKey,UINT uScanCode,CONST LPBYTE lpbKeyState,LPDWORD lpdwTransKey,UINT fuState,HIMC hIMC)
这个接口能够说是输入法最重要的部分,程序员须要在这个接口中实现编码与重码的转换,转换完成或者显示在编码窗口及重码窗口,或者发送到应用程序.
因为在这个接口中没有传入窗口句柄,如何通知输入法程序的窗口更新显示呢?固然咱们可使用全局变量,在此我我的推荐的方法是使用IME消息(没有什么道理),您将消息类型参数保存到lpdwTransKey指示的缓冲区中,User.exe会根据消息类型作相应的处理并传递到UIWnd这个窗口中.
那么如何输入文字呢?要输入文字须要3个消息配合使用,分别是WM_IME_STARTCOMPOSITIONWM_IME_COMPOSITION和WM_IME_ENDCOMPOSITION,它们分别指示开始输入编码,输入编码或者结果(视参数而异)及编码输入完成.
在开始编写输入法的时候,为了省事,个人输入法在用户肯定要输入一个重码时才连续调用这3个消息以向编码器中输入文字.因为WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION须要成对使用,这种方法能够确保它们配对.
最初这种方式工做得很好,可是后来发如今一些软件中出现兼容性问题如智能五笔在遨游中就存在这个问题,在遨游中的地址栏中打开智能五笔,当须要使用回退键来删除错误输入的编码时,会发现删除的不是编码窗口中的编码而是编辑器中的文字这是由于相似遨游这类软件主动接管了按键输入如处理一些控制键,当它发现这些控制键不在WM_IME_STARTCOMPOSITION和WM_IME_ENDCOMPOSITION这两个消息之间时就本身处理控制键而不是先交给User.exe了.
所以正确的流程应该是在开始输入编码时发送WM_IME_STARTCOMPOSITION,输入结束后发送WM_IME_ENDCOMPOSITION消息.
#ImeToAsciiEx:根据输入法上下文的内容,使用输入法编辑器的转换引擎产生转换结果,将相应的字符消息放入指定缓冲区中。返回值是产生消息的条数,若是此数量大于消息缓冲区的长度,系统转而从输入法上下文的hMsgBuf项中读取消息的内容。该函数和ImeProcessKey函数一块儿构成了键盘输入方式下输入法编辑器转换引擎的主体;资源

 

 
NotifyIME:系统或(IME有意识)应用程序通知输入法编辑器根据参数修改输入法编辑器的当前状态。好比:显示/隐藏候选窗口,选定某个候选项,更新候选窗口页起始位置和页尺寸,更新输入上下文内容,修改写做串内容等等;

 


ImeRegisterWord:向输入法编辑器的词典里增长一个新词;

 


ImeUnregisterWord:把某个词今后输入法编辑器的词典里去掉;

 


ImeGetRegisterWordStyle:取得本输入法编辑器支持的词风格的列表;

 


ImeEnumRegisterWord:列出符合给定条件的全部字符串。

 

/**********************************************************************/
/* UIWndProc() */
/* IME UI window procedure */
/**********************************************************************/
LRESULT WINAPI UIWndProc(HWND hUIWnd, UINT message,WPARAM wParam, LPARAM lParam)
这是一个很是重要的接口,基本上一它负责各类消息的传递.通常您须要在这个接口中根据不一样的消息类型,实现输入法窗口(如编码窗口,重码窗口,状态栏窗口)的显示隐藏及更新等操做.
这个接口实现的功能可能很是复杂,视状况而异,在此就不作更加深刻的说明了.在使用时能够参见示例工程.

 

StatusWndProc:状态窗口的窗口函数.CompWndProc:写做窗口的窗口函数.CandWndProc:候选窗口的窗口函数.