近日在开发类似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;}
}

切换输入法导致程序死机的解决办法相关推荐

  1. java让电脑死机怎么办,win7系统Java活动脚本出错导致电脑死机的解决方法

    win7系统使用久了,好多网友反馈说win7系统Java活动脚本出错导致电脑死机的问题,非常不方便.有什么办法可以永久解决win7系统Java活动脚本出错导致电脑死机的问题,面对win7系统Java活 ...

  2. java让电脑死机怎么办,技术编辑教你解决win7系统Java活动脚本出错导致电脑死机的解决步骤...

    很多用户都遇到过win7系统Java活动脚本出错导致电脑死机的问题吧,根据小编的了解并不是每个人都会处理win7系统Java活动脚本出错导致电脑死机的问题,因此我就给大家整理总结了win7系统Java ...

  3. 电脑一安装java就死机_win7系统Java活动脚本出错导致电脑死机的解决方法

    无论谁在使用电脑的时候都可能会发现Java活动脚本出错导致电脑死机的问题,Java活动脚本出错导致电脑死机让用户们很苦恼,这是怎么回事呢,Java活动脚本出错导致电脑死机有什么简便的处理方式呢,其实只 ...

  4. STM32Gx系列进入NMI中断造成芯片死机的解决办法

    STM32Gx系列进入NMI中断造成芯片死机的解决办法 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 STM32Gx系列进入NMI中断造成芯片死机的解决办法 前言 一.问 ...

  5. 计算机死机的解决办法,电脑死机怎么办?详细教您解决方法

    有时我们在使用电脑时电脑突然卡死,鼠标不能移动,键盘按键也没有任何反应,这个时候我们应该怎么办呢?小编将在这里给大家介绍电脑死机的解决办法,大家有遇到这个问题可以尝试用小编提供的方法解决. 我们电脑用 ...

  6. 中文输入法切换死机的解决办法

    转自http://blog.csdn.net/chenlycly/article/details/7345040 近日在开发类似QQ屏幕截图过程中,发现在输入文字时切换输入法(Ctrl+Shift)时 ...

  7. 玩守望先锋2老是死机的解决办法

    守望先锋2是非常火热的一款游戏,但是有玩家在玩游戏的时候经常出现死机的情况,导致游戏体验感非常差,那有什么解决的办法吗?下面就来看看小编整理的一些解决办法,说不定有用. Win10玩守望先锋2老是死机 ...

  8. 虚拟机一插U盘或读卡器就死机的解决办法

    问题描述:当开启虚拟机,插上U盘,虚拟机就死机 问题分析:可能虚拟机不兼容的情况,需要升级内核,或者降低USB版本 解决办法: 方法一:升级内核版本,这个比较麻烦,没试过 方法二:降低USB版本 打开 ...

  9. putty连接centos/Ubuntu一段时间无操作无法输入 死机 断线解决办法

    解决办法比较简单: PuTTY设置,putty -> Connection -> Seconds between keepalives ( 0 to turn off ),默认为0,改为5 ...

最新文章

  1. 复习07统计学习方法(支持向量机SVM)---图片版
  2. 读“基于机器学习的无参考图像质量评估综述”有感
  3. pytorch中ModuleNotFoundError: No module named ‘tensorboard‘
  4. 已知bug列表——Solidity中文文档(12)
  5. Python过渡性模块重载(递归重载模块)
  6. 欢迎参与 KubeVela 官方文档翻译活动
  7. Java08-day08【API(概述、使用)、String-StringBuilder(概述、构造方法、特点、方法)、StringBuilder和String相互转化】
  8. VTK:彩色海拔地图用法实战
  9. 日本新研究:将光伏组件高温高湿试验速度提高70倍
  10. sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询
  11. python脚本转换为EXE文件
  12. 八大常用渗透测试工具
  13. 用户登录MySQL服务器的方法
  14. 大众CEO提前“毕业”,马斯克:软件是通向未来的关键
  15. 要管理此计算机上的用户账户,Win10安装软件用户账户控制提示管理员已阻止运行此应用解决方法...
  16. 微信小程序系列4——传值详解
  17. Vue组织架构图组件
  18. 云宏与英特尔携手发布了基于英特尔®至强®可扩展平台全面升级
  19. java的反射机制~~!
  20. 算术移位和逻辑移位详解

热门文章

  1. 大王java_加瓦java大王
  2. 艾美捷Bio-Helix CCH321 超敏ECL化学发光试剂盒(皮克级)特点
  3. 办公最常用哪个邮箱?怎么申请商务邮箱?
  4. 2022 年度作品优秀大赏 | 开发者说·DTalk
  5. WPS无法用Ctrl V进行粘贴,怎么办?
  6. 非常详细的讲解让你深刻理解神经网络NN(neural network)
  7. 会声会影2023旗舰版新增七大功能介绍
  8. 一、全文检索引擎的介绍
  9. 森林防火指挥系统截图
  10. jquery 如何使用innerHTML