我在Google和Microsoft钩子文档中搜索了很多,我发现了很多如何创建钩子,但我已经知道如何做到这一点。如何让我的钩子(在这种情况下是键盘钩子)在队列中首先接收消息?我试图让我的钩子尽可能靠近硬件输入,以防止另一个键钩改变输入。 I.E:App1运行一个关键钩子来欺骗不注入KBDLLHOOK的标志。在他们可以更改LLKHF_INJECTED中的标志之前,我如何获得该消息?在别人之前处理我的WindowsHook
TL; DR我的钩子如何在另一个之前获得消息以防止密钥注入?我知道的消息队列转为在最后一阶,但不知何故,不管我以前开始我的程序或应用1后,仍然得到了:我使用的测试
LRESULT CALLBACK keybdProc(int n, WPARAM w, LPARAM l)
{
KBDLLHOOKSTRUCT *kbdll = (KBDLLHOOKSTRUCT*)l;
if (w == WM_KEYDOWN)
{
switch (kbdll->flags)
{
case LLKHF_INJECTED:
printf("%d/%c is an Injected Key Press (Reject)\n", kbdll->vkCode, char(kbdll->vkCode));
break;
default:
printf("%d/%c Not injected (Continue)\n", kbdll->vkCode, char(kbdll->vkCode));
break;
}
}
return 0; //CallNextHookEx(NULL, n, w, l);
}
int main()
{
HHOOK keybdHk = SetWindowsHookEx(WH_KEYBOARD_LL, keybdProc, GetModuleHandle(NULL), 0);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)>0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(keybdHk);
return 0;
}
编辑
简单的代码在我的Keyhook之前输入,然后不会调用NextHook(所以我的钩子永远不会得到它)或欺骗它。
思想实验:说有一种方法把自己放在第一位。其他钩子程序不会*也这么做吗? – Blorgbeard
是的,但是我的计划是在它把自己放在第一位之后,我把它放在它前面。如果每隔x分钟刷新一次,我会刷新x-1分钟。创造某种'军备竞赛'的情况。 @Blorgbeard – Exsanity
文档确实提到'WH_KEYBOARD'挂钩在'WH_KEYBOARD_LL'之前运行。如果你真的想成为第一,没有什么会击败一位车手,但这可能有点过分。现在进入无证土地,如果内存服务,我通常会看到(低级别)键盘挂钩稍后注册,但我没有这样说。 – chris