博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
切换输入法导致程序死机的解决办法
阅读量:2392 次
发布时间:2019-05-10

本文共 1262 字,大约阅读时间需要 4 分钟。

        近日在开发类似QQ屏幕截图过程中,发现在输入文字时切换输入法(Ctrl+Shift)时,会导致程序出现“卡死”现象。为了方便代码重用,屏幕截图模块是以动态库方式封装起来的。出现“卡死”现象后,只能通过任务管理器强制杀掉对应的进程才能退出程序。于是,上网搜索了相关话题,发现原因通常是某种输入法如紫光或搜狗输入法导致了程序死机,也可能是某种软件与输入法冲突导致死机。

        通过代码注释最终找到了问题所在,可能在程序调用的某个dll库中截获了输入法消息,但是没有将输入法消息释放出来给界面线程处理导致界面挂死。

        那么输入法具体机制又是怎么的呢?Windows的输入法其实就是一个系统目录下的IME文件,IME文件其实就是一个特殊的DLL,它必须具有输入法程序所规定的那些接口。输入法是由输入法管理器(imm32.dll)控制的,输入法管理器又是由user32.dll控制的。当在应用程序中通过鼠标或者键盘(user32.dll捕获这些事件)激活某个输入法时,输入法管理器就会在那个应用程序的进程中加载对应的IME文件,加载IME文件跟加载普通的DLL并没有本质区别,所以,我们可以认为,输入法其实就是载入到应用程序中的一个DLL文件。在切换输入法之前输入法文件并不会被载入,切换输入法之后OS向系统中的获得焦点的窗口POST一条WM_INPUTLANGCHANGEREQUEST消息,该消息可以在窗口的后台激活输入法,如果某个窗口自动激活失败,就需要在那个窗口中手工切换输入法,这样才能将输入法文件载入进去。微软对发送WM_INPUTLANGCHANGEREQUEST消息时机的解释是:当用户选择某种输入语言,或输入语言的热键改变。

        系统发送WM_INPUTLANGCHANGEREQUEST消息时会附带参数lParam,lParam代表切换后的输入法标识。此标识可以被ActivateKeyboardLayout作为参数使用,ActivateKeyboardLayout用于激活对应输入法。代码如下:

HKL hkl  = (HKL)pMsg->lParam;ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法

       主线程激活对应输入法之后,需要返回True,不让其它线程处理输入法消息,避免出现卡死现象。具体的解决办法:只需在你的主线程消息入口添加如下代码即可:

BOOL CXXXApp::PreTranslateMessage(MSG* pMsg) {	// 解决切换输入法时,导致死机的问题。	if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)	{		HKL hkl  = (HKL)pMsg->lParam;		ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法				// 直接返回,不要调用默认的输入法处理;否则会导致死机		return TRUE;	} }

转载地址:http://czeab.baihongyu.com/

你可能感兴趣的文章
HDU 4121 模拟
查看>>
vim配置文件(持续更新)
查看>>
Fedora 16下添加终端快捷键
查看>>
HDU 4007 线扫描
查看>>
HDU 4001 DP LIS
查看>>
HDU 4023 贪心+博弈
查看>>
HDU 4036 物理坑爹题
查看>>
Linux文件解压命令汇总(持续更新)
查看>>
HDU 4046 树状数组
查看>>
HDU 4034 图论 Floyd
查看>>
HDU 4027 线段树
查看>>
HDU 4049 状态压缩DP
查看>>
SGU 253 计算几何 判定点是否在凸包内
查看>>
Fedora 16 卸载 ATI 显卡驱动
查看>>
Fedora 16 安装 ATI显卡驱动
查看>>
vim 添加代码补全功能(Omnicppcomplete 添加对STL支持)
查看>>
HDU 4013 图论 树的最小表示
查看>>
Ubunu下moderncv加载moderntimeline
查看>>
Ubuntu 12.04安装Jetty
查看>>
Ubuntu 12.04安装OpenCV
查看>>