ActiveX控件在IE中不響應Backspace消息

1、操作輸入法需要導入:
#include <imm.h>
#pragma comment(lib, "imm32")

2、定義變量:
//鍵盤鉤子句柄
HHOOK g_hKeyboardHook = NULL;
//是否攔截Backspace
bool g_bInterceptBackspace = true;

 3、定義鍵盤鉤子回調函數:

LRESULT CALLBACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode > -1)
	{
		BOOL bRet = FALSE;
		LPKBDLLHOOKSTRUCT lpKeyboard = (LPKBDLLHOOKSTRUCT)lParam;
		HWND hCurWnd = ::GetFocus();
		HIMC hImc = ImmGetContext(hCurWnd);
		LONG nSize = ImmGetCompositionString(hImc, GCS_COMPSTR, NULL, 0);
		ImmReleaseContext(hCurWnd, hImc);
		if (hImc)
		{
			if (nSize > 0)
			{
				//如果按鍵組合窗口字符串長度大於0,則表明顯示了按鍵組合窗口,交給系統默認處理
				g_bInterceptBackspace = false;
				bRet = TRUE;
			}
			else if (nSize == 0)
			{
				if (!g_bInterceptBackspace)
				{
					//如果按鍵組合框窗口字符串等於0,且上次顯示了按鍵組合框窗口,則表明是刪除最後一個字符後,交給系統默認處理
					g_bInterceptBackspace = true;
					bRet = TRUE;
				}
			}
		}
		if (VK_BACK == wParam)
		{
			if (!bRet)
			{
				if (lParam & 0x80000000)
				{
					::SendMessage(::GetFocus(), WM_KEYUP, VK_BACK, 0);
				}
				else
				{
					::SendMessage(hCurWnd, WM_KEYDOWN, VK_BACK, 0);
					::SendMessage(hCurWnd, WM_CHAR, VK_BACK, 0);
				}
				return 1;
			}
		}
	}

	return CallNextHookEx(g_hKeyboardHook, nCode, wParam, lParam);
}

4、安裝鉤子

g_hKeyboardHook = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardHookProc, 0, GetCurrentThreadId());

 

5、卸載鉤子

::UnhookWindowsHookEx(g_hKeyboardHook);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章