MFC: 按键响应事件切到中文输入法卡死

最近做了一个MFC项目,用到了按键响应事件,发现当在中文输入法下有按下按键的动作之后,MFC程序就会卡死
解决方法①

经过切换输入法发现:搜狗中文输入法下会卡死,但是微软的中文下不会卡死,只是那样就是打拼音了而已,无法执行按键事件,但不卡死就好

解决方法②先找到类视图
找不到可以在VS的右上角搜索
MFC: 按键响应事件切到中文输入法卡死_第1张图片找到XXXAPP,右击属性
MFC: 按键响应事件切到中文输入法卡死_第2张图片找到重写
MFC: 按键响应事件切到中文输入法卡死_第3张图片
在工程名.cpp会生成以下函数

BOOL CTimeRecordingApp::PreTranslateMessage(MSG* pMsg)
{
     
// TODO: 在此添加专用代码和/或调用基类
return CWinApp::PreTranslateMessage(pMsg);
}

我们加入以下代码

BOOL CTimeRecordingApp::PreTranslateMessage(MSG* pMsg)
{
     
	// TODO: 在此添加专用代码和/或调用基类
	const TCHAR sClassName[] = _T("IME");
	const TCHAR sWindowText[] = _T("Default IME");

	HWND hImeWnd01 = FindWindow(sClassName, sWindowText);
	HWND hImeWnd02 = NULL;
	DWORD dwProcessID = 0, dwCurrentThreadID = GetCurrentThreadId();

	while (IsWindow(hImeWnd01))
	{
     
		if (dwCurrentThreadID == GetWindowThreadProcessId(hImeWnd01, &dwProcessID))
		{
     
			hImeWnd02 = hImeWnd01;
		}
		else
		{
     
			hImeWnd02 = NULL;
		}

		if (hImeWnd02 != NULL)
		{
     
			DestroyWindow(hImeWnd02);
		}

		hImeWnd01 = FindWindowEx(NULL, hImeWnd01, sClassName, sWindowText);
	}
	return CWinApp::PreTranslateMessage(pMsg);
}

问题解决,在搜狗输入法和微软下都可以了,其实质是禁用了搜狗的中文输入法,如下图,不知道如果有输入文字的需要行不行呢
在这里插入图片描述
解决方法③和方法②一样,只是加的代码不一样,我没有测试成功,不过智者见智,也许对大家的工程有用呢

BOOL CTimeRecordingApp::PreTranslateMessage(MSG* pMsg)
{
     
	// TODO: 在此添加专用代码和/或调用基类
	if (pMsg->message == WM_INPUTLANGCHANGEREQUEST)
	{
     
		HKL hkl = (HKL)pMsg->lParam;
		ActivateKeyboardLayout(hkl, KLF_REPLACELANG);//激活对应输入法
		// 直接返回,不要调用默认的输入法处理;否则会导致死机
		return TRUE;
	}
	return CWinApp::PreTranslateMessage(pMsg);
}

你可能感兴趣的:(MFC,BUG人生)