我正在编写程序并使用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);
}
答案 0 :(得分:1)
这些类型的钩子通常会在hook chain
中注入一个函数
钩链由链中的每个链接管理。
这里发生的事情是你的函数因你的断点而被阻止,这意味着你的函数(你正在调用的dll)无法调用链中的下一个键盘钩子。因此,您的输入似乎已被冻结。
当你也在挂钩鼠标时 - 同样的事情发生在那里,你现在无法向IDE提供输入以告诉它继续运行。
Ctl + Alt + Del 是由内核处理的安全密钥序列,所以你几乎无能为力序列被中断。
我建议你分别调试你的鼠标和键盘钩子,记住你在这里学到的东西。 (例如,如果在恢复原始挂钩链之前终止程序,则可能会丢失键盘/鼠标,直到下次注销/登录为止。)