您的位置:首页 > Web前端 > HTML

Htmlayout对话框程序输入法切换问题解决方案

2013-04-15 10:24 211 查看
一、背景:

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;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: