解决方法:由Windows切换输入法引起的程序冻结的解决方案

电脑杂谈  发布时间:2020-09-11 01:10:18  来源:网络整理

win10切换输入法卡机_会声会影10序列号输入_win php套件

最近,在开发类似于QQ的屏幕截图的过程中,我发现在输入文本时切换输入法(Ctrl + Shift)会使程序“挂起”。为了便于代码重用,屏幕截图模块封装在动态库中。发生“卡住”现象后,只能通过任务管理器强制终止相应的进程来退出程序。结果,我在Internet上搜索了相关主题,发现原因通常是由某些输入法(例如Ziguang或Sogou输入法)引起的程序崩溃,或者可能是由某些软件与输入之间的冲突引起的方法。

最后通过代码注释找到了问题。输入法消息可能会在程序调用的dll库中被拦截,但输入法消息未释放到接口线程进行处理,导致接口挂起。

那么输入法的具体机制是什么? Windows输入法实际上是系统目录中的IME文件。 IME文件实际上是一个特殊的DLL,它必须具有输入法程序指定的接口。输入法由输入法管理器(imm3 2. dll)控制,输入法管理器由user3 2. dll控制。通过应用程序中的鼠标或键盘激活输入法(user3 2. dll捕获这些事件)时,输入法管理器将在该应用程序的过程中加载相应的IME文件,加载IME文件并加载。普通的DLL之间没有本质区别,因此我们可以认为输入法实际上是一个加载到应用程序中的DLL文件。在切换输入法之前,不会加载输入法文件。切换输入法后,操作系统将WM_INPUTLANGCHANGEREQUEST消息发布到系统中的焦点窗口。该消息可以激活窗口背景中的输入法。如果自动激活窗口如果失败,则需要在该窗口中手动切换输入法,以便可以加载输入法文件。 Microsoft对发送WM_INPUTLANGCHANGEREQUEST消息的时间的解释是:当用户选择某种输入语言或输入语言的热键更改时。

当系统发送WM_INPUTLANGCHANGEREQUEST消息时,将附加参数lParam,而lParam表示切换后的输入法标识符。该标志可以被ActivateKeyboardLayout用作参数,该键用于激活相应的输入法。代码如下:

win php套件_会声会影10序列号输入_win10切换输入法卡机

HKL hkl =(HKL)pMsg-> lParam;

ActivateKeyboardLayout(hkl,KLF_REPLACELANG); //激活相应的输入法

主线程激活相应的输入法后,需要返回True,以防止其他线程处理输入法消息以避免阻塞。具体解决方案:只需将以下代码添加到您的主线程消息条目中即可:

会声会影10序列号输入_win10切换输入法卡机_win php套件

BOOL CXXXApp :: PreTranslateMessage(MSG * pMsg)

{

//解决了切换输入法时的崩溃问题。

会声会影10序列号输入_win10切换输入法卡机_win php套件

if(pMsg-> message == WM_INPUTLANGCHANGEREQUEST)

{

HKL hkl =(HKL)pMsg-> lParam;

ActivateKeyboardLayout(hkl,KLF_REPLACELANG); //激活相应的输入法

win10切换输入法卡机_win php套件_会声会影10序列号输入

//直接返回,不调用默认的输入法进行处理;否则会导致崩溃

returnTRUE;

}

}


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shumachanpin/article-318325-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...