Keyboardhook程序中的程序中断会锁定Windows

时间:2013-12-01 17:42:33

标签: c# keyboard-hook

我正在编写程序并使用SetWindowsHookEx来设置全局Keyboard钩子。每当我打断我的程序时(例如,使用断点或异常被抛出),Windows就会完全锁定,除了ctrl + alt + del之外,没有任何输入被处理。我甚至无法使用任务管理器来关闭应用程序。

显然,这对于开发复杂的应用程序来说是相当糟糕的,我想知道这里存在哪些变通方法?有没有办法阻止钩子像这样锁定窗口?我通过PInvoke在C#中使用C ++编写的DLL。设置挂钩是通过

完成的
EXPORT BOOL CALLBACK SetupHook (HWND hParent){
   hWindow = hParent;
   hhkHook = SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL);
   hhkMouseHook = SetWindowsHookEx(WH_MOUSE, MouseHookProc, hDllInstance, NULL);
   return TRUE;
}

然后使用

重定向消息
LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam){
    if (nCode == HC_ACTION){
        if ((lParam & 1073741824) != 1073741824){
           SendMessage ((HWND) hWindow, (WM_USER + 2), wParam, lParam);
        }
    }
    return CallNextHookEx (hhkHook, nCode, wParam, lParam);
}

1 个答案:

答案 0 :(得分:1)

这些类型的钩子通常会在hook chain中注入一个函数 钩链由链中的每个链接管理。

这里发生的事情是你的函数因你的断点而被阻止,这意味着你的函数(你正在调用的dll)无法调用链中的下一个键盘钩子。因此,您的输入似乎已被冻结。

当你也在挂钩鼠标时 - 同样的事情发生在那里,你现在无法向IDE提供输入以告诉它继续运行。

Ctl + Alt + Del 是由内核处理的安全密钥序列,所以你几乎无能为力序列被中断。

我建议你分别调试你的鼠标和键盘钩子,记住你在这里学到的东西。 (例如,如果在恢复原始挂钩链之前终止程序,则可能会丢失键盘/鼠标,直到下次注销/登录为止。)