我正在编写一个程序,并使用SetWindowsHookEx设置全局键盘挂钩。每当我中断程序时(例如,使用断点或抛出异常),窗口就会完全锁定,除了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);
}
这些类型的钩子通常将函数注入hook chain
钩链由链中的每个环节管理。
这里发生的情况是,你的函数因为断点而被阻止,这意味着你的函数(你正在pin voking的dll)无法调用链中的下一个键盘挂钩。因此,您的输入似乎已冻结。
当您也挂起鼠标时,同样的事情也会发生,现在您无法向IDE提供输入来告诉它继续运行。
Ctl+Alt+Del是一个由内核处理的安全密钥序列,因此您几乎无法防止该序列被中断。
我建议你分别调试鼠标和键盘挂钩,记住你在这里学到的东西。(例如,如果在恢复原始钩链之前终止程序,则在下一次注销/登录之前,您可能会丢失键盘/鼠标)。