转自http://blog.csdn.net/chenlycly/article/details/7345040

近日在开发类似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用于激活对应输入法。代码如下:

[cpp] view plaincopy
  1. HKL hkl  = (HKL)pMsg->lParam;
  2. ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法

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

[cpp] view plaincopy
  1. BOOL CXXXApp::PreTranslateMessage(MSG* pMsg)
  2. {
  3. // 解决切换输入法时,导致死机的问题。
  4. if ( pMsg->message == WM_INPUTLANGCHANGEREQUEST)
  5. {
  6. HKL hkl  = (HKL)pMsg->lParam;
  7. ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法
  8. // 直接返回,不要调用默认的输入法处理;否则会导致死机
  9. return TRUE;
  10. }
  11. }

中文输入法切换死机的解决办法相关推荐

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

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

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

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

  3. 切换输入法导致程序死机的解决办法

    近日在开发类似QQ屏幕截图过程中,发现在输入文字时切换输入法(Ctrl+Shift)时,会导致程序出现"卡死"现象.为了方便代码重用,屏幕截图模块是以动态库方式封装起来的.出现&q ...

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

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

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

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

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

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

  7. win10dnf服务器未响应,win101903玩DNF卡顿 ,掉线,死机的解决办法

    许多玩家用win101903电脑玩DNF游戏的时候,肯定经常遇到卡顿,掉线!特别是玩召唤的玩家估计是边刷图边哭!出现这样的情况首先要确保当前网络正常,dnf对网络要求很高,在确保网速没问题的前提下那么 ...

  8. Ubuntu中的输入法突然变成了繁体字解决办法及中英输入法切换

    虚拟机中ubuntu输入法的切换 出现的问题 解决办法 输入法的切换 出现的问题 在ubuntu系统下,输入法使用一段时间之后,输入拼音之后,莫名其妙变成显示繁体字. 不知道是不小心点到了什么还是不小 ...

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

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

最新文章

  1. 设计模式--简单工厂模式
  2. SBO用户清理(最近一直未登录过用户)
  3. 使用正则表达式解析http请求url中的参数和参数值
  4. php中改变函数路由,php – 如何修改codeigniter中的路由
  5. java显示长度和第一个字符_从Java字符串中以长度1的字符串返回的第一个字母的最佳方法是什么?...
  6. Kubernetes 部署 Ingress 控制器 Traefik v1.7.4
  7. java取文本首位_java – 从文本文件中读取的第一个字符:[复制]
  8. Oracle11g导出空表解决方法
  9. STDN:Scale-Transferrable Object Detection 论文解析
  10. java adt真机调试_Unity Android 真机调试
  11. TinyGAN: Distilling BigGAN for Conditional Image Generation
  12. 电力系统稳态matlab,基于MATLAB的电力系统稳态仿真分析
  13. cygwin安装wget
  14. 阿里测试岗,面试官狂问自动化,把我问到哑口无言……
  15. 关于Python可视化Dash工具—plotly基本图形
  16. 华为手机如何用微信与电脑连接服务器,华为手机也能连接苹果电脑,只需这样做...
  17. 老外名字中间的点怎么输入 微软拼音 @
  18. 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现
  19. 【文献学习】 2021 Deep-Waveform: A Learned OFDM Receiver Based on Deep Complex Convolutional Networks
  20. 03--SSM的知识与应用之Spring

热门文章

  1. 如何理解这段代码:void (*signal (int sinno,void(*func)(int)))(int)
  2. java基础-网络编程
  3. WPS计算机一级考试知识点,计算机一级考试WPS练习题及答案
  4. 南宁职业技术学院计算机专业宿舍,南宁职业技术学院星级文明宿舍评比办法(试行)...
  5. 功能点算法及在软件测试中的应用Part3
  6. VC2005操作Word
  7. 蒙特卡罗MCNP学习汇总(一)-----MCNP简介及编写第一个程序
  8. 如何实现从M个数字选取N个数字排列算法
  9. fuse的安装与使用
  10. 请简述什么是mysql,MySQL之什么是MySQL