Htmlayout对话框程序输入法切换问题解决方案
一、背景:
Htmlayout的附载容器是dialog时候中文无法输入(无法切换输入法程序),包括SDK中封装的dialog类。
二、原因:
1、调用的某个dll(初步怀疑是Htmlayout.dll)拦截了输入法消息,但是没有将输入法消息释放出来给界面线程处理;
2、Htmlayout窗口本身未能激活输入法消息;
结论:因为这种情况只出现在dialog中,而非模态窗口一切正常。故MS可能在dialog内部做了什么龌龊的事情。原因1不可靠!
三、WM_INPUTLANGCHANGEREQUEST
解释:当用户选择某种输入语言,或输入语言的热键改变。
四、网述机制:
【那么输入法具体机制又是怎么的呢?Windows的输入法其实就是一个系统目录下的IME文件,IME文件其实就是一个特殊的DLL,它必须具有输入法程序所规定的那些接口。输入法是由输入法管理器(imm32.dll)控制的,输入法管理器又是由user32.dll控制的。当在应用程序中通过鼠标或者键盘(user32.dll捕获这些事件)激活某个输入法时,输入法管理器就会在那个应用程序的进程中加载对应的IME文件,加载IME文件跟加载普通的DLL并没有本质区别,所以,我们可以认为,输入法其实就是载入到应用程序中的一个DLL文件。在切换输入法之前输入法文件并不会被载入,切换输入法之后OS向系统中的获得焦点的窗口POST一条WM_INPUTLANGCHANGEREQUEST消息,该消息可以在窗口的后台激活输入法,如果某个窗口自动激活失败,就需要在那个窗口中手工切换输入法,这样才能将输入法文件载入进去】。
系统发送WM_INPUTLANGCHANGEREQUEST消息时会附带参数lParam,lParam代表切换后的输入法标识。此标识可以被ActivateKeyboardLayout作为参数使用,ActivateKeyboardLayout用于激活对应输入法。
五、代码:
BOOL CXX::PreTranslateMessage(MSG* pMsg)
{
if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)
{
HKL hkl = (HKL)pMsg->lParam;
ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法
return TRUE;
}
}
补充:综合编程 , 其他综合 ,