【问题标题】:Program interruptions in Keyboardhook program lock up WindowsKeyboardhook 程序中的程序中断会锁定 Windows
【发布时间】:2013-12-02 03:39:28
【问题描述】:

我正在编写一个程序并使用 SetWindowsHookEx 设置全局键盘挂钩。每当我中断我的程序(例如,使用断点或抛出异常)时,Windows 都会完全锁定,因为除了 ctrl+alt+del 之外,不再处理任何输入。我什至无法使用任务管理器关闭应用程序。

显然,这对于开发复杂的应用程序是相当不利的,我想知道这里有哪些解决方法?有什么办法可以防止挂钩像那样锁住窗户吗?我正在通过 PInvoke 在 C# 中使用 C++ 编写的 DLL。设置 Hook 是通过

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);
}

【问题讨论】:

  • 使用远程调试器,这样您自己的机器就不会受到影响。
  • @HansPassant 我会调查的。谢谢。

标签: c# keyboard-hook


【解决方案1】:

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

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

因为您还挂上了鼠标 - 同样的事情发生在那里,您现在无法向 IDE 提供输入来告诉它继续运行。

Ctl+Alt+Del 是由内核处理的安全密钥序列,因此您几乎无法采取任何措施来防止这种情况发生序列不会被打断。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多