2017-10-19 249 views
-3

我在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(所以我的钩子永远不会得到它)或欺骗它。

+6

思想实验:说有一种方法把自己放在第一位。其他钩子程序不会*也这么做吗? – Blorgbeard

+0

是的,但是我的计划是在它把自己放在第一位之后,我把它放在它前面。如果每隔x分钟刷新一次,我会刷新x-1分钟。创造某种'军备竞赛'的情况。 @Blorgbeard – Exsanity

+1

文档确实提到'WH_KEYBOARD'挂钩在'WH_KEYBOARD_LL'之前运行。如果你真的想成为第一,没有什么会击败一位车手,但这可能有点过分。现在进入无证土地,如果内存服务,我通常会看到(低级别)键盘挂钩稍后注册,但我没有这样说。 – chris

回答

1

挂钩在hook chains中管理,挂钩程序按从前到后的顺序执行。 As documented

SetWindowsHookEx函数总是在钩子链的开始处安装钩子过程。当发生由特定类型的钩子监控的事件时,系统在与钩子相关联的钩子链的开始处调用该过程。链中的每个挂钩过程都决定是否将事件传递给下一个过程。

要让您的钩子首先被调用,它需要最后安装。虽然这很容易确定,但在钩链中维持该位置是不可能的。

相关问题