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



我正在编写一个程序,并使用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是一个由内核处理的安全密钥序列,因此您几乎无法防止该序列被中断。

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

最新更新