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); }
低级键盘钩子修改消息
猜你喜欢
转载自vista-move.iteye.com/blog/2151938
今日推荐
周排行