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用于激活对应输入法。

五、代码:

  1. BOOL CXX::PreTranslateMessage(MSG* pMsg)   
  2. {  
  3.     if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)  
  4.     {  
  5.         HKL hkl  = (HKL)pMsg->lParam;  
  6.         ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法    
  7.          return TRUE;  
  8.     }   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值