低级键盘钩子修改消息

bool flag = false;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	if (nCode == HC_ACTION)
	{
		KBDLLHOOKSTRUCT* pStruct = (KBDLLHOOKSTRUCT*)lParam;
		
		//只允许输入数字、字母、shift、backspace,其他字符都过滤
		if (!(pStruct->vkCode >= 48 && pStruct->vkCode <= 57) && !(pStruct->vkCode >= 65 && pStruct->vkCode <= 90) && pStruct->vkCode != VK_BACK && pStruct->vkCode != VK_SHIFT) {
			return TRUE;
		}
		
		switch (wParam){
		
		case WM_KEYDOWN:
		{
			//如果是字符进行替换
			if (pStruct->vkCode > 32 && pStruct->vkCode <= 126)
			{
				if (flag == true)
				{
                                        //捕捉到keybd_event模拟按键
					break;
				}
				//当下面调用keybd_event时,会导致立即又重入键盘钩子函数,
				//执行完一次钩子函数后才回到这里。
				//我们设置了一个flag=true,由于使用keybd_event导致
				//重入键盘函数时,判断flag为true,知道是模拟按键,直接返回
				//默认操作。如果是flag==false,说明是捕获到的键盘按键了。
				//记住,一定要使用低级键盘钩子,一般的键盘钩子调用keybd_event
				//不会导致马上重入钩子函数。			
				flag = true;
				keybd_event(L'P', MapVirtualKey(L'P', 0), KEYEVENTF_EXTENDEDKEY, 0);
				flag = false;
				return TRUE;
			}		
		}
		}
	}
	// 传给系统中的下一个钩子
	return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

你可能感兴趣的:(低级键盘钩子 修改按键消息)