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;
}
}
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;
}
}
相关文章推荐
- 微信小程序 navigate页面跳转问题解决方案
- VS2008下编译C++程序,解决找不到 stdint.h的问题方案
- 微信小程序问题解决方案
- vs2010入门程序和出错问题解决方案
- MFC关于解决点击关闭,对话框仍有后台程序运行问题
- MFC关于解决点击关闭,对话框仍有后台程序运行问题 .
- 微信小程序 122100版本更新问题解决方案
- 关于“在MFC对话框程序中图片显示不出来”问题的解决方法
- 解决sleep延时阻塞程序主线程,造成程序未响应问题方案
- 应对vs更新程序引用集的小bug问题的方案 很不可思议的解决方法
- Hadoop MapReduce程序中解决第三方jar包问题方案
- MFC程序打开文件对话框出错的问题解决
- 编写 PhoneGap 程序调试问题解决方案
- 远程桌面,程序自动关闭问题解决方案
- 64位linux不能运行32位程序,问题解决方案
- 对话框程序菜单项可以禁用但不变灰问题的解决方法
- VS2012 每次编译程序都会出现”无法查找或打开 PDB 文件“问题解决方案
- MFC程序打开文件对话框出错的问题解决
- 小程序HTTPS请求问题解决方案
- Android:Consumer closed input channel or an error occurred. events=0x8异常导致程序异常终止问题解决方案