
最近,在开发类似于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用作参数,该键用于激活相应的输入法。代码如下:

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); //激活相应的输入法

//直接返回,不调用默认的输入法进行处理;否则会导致崩溃
returnTRUE;
}
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shumachanpin/article-318325-1.html
现在是剩女多好吧
这个新闻
反而给中国扶持出强大的敌人