当前位置:编程学习 > 网站相关 >>

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; 
    }  
}
 

 

补充:综合编程 , 其他综合 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,