#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);