【问题标题】:Is it okay to continuously hook and unhook keyboard?可以连续挂机和脱机键盘吗?
【发布时间】:2012-07-02 05:05:51
【问题描述】:

我在 vb.net 中遇到了 WindowsHookEx 的问题。如果我的电脑过载,尤其是 3D 渲染,Windows 会自动断开我的键盘挂钩并且我的热键停止工作。我四处搜寻,似乎没有办法检测钩子是活动的还是断开的。所以我尝试了“moodforaday”提出的这个方法 Is it possible to detect when a low-level keyboard hook has been automatically disconnected by Windows? hook-has-been-automatically-d

他表示定期使用 GetLastInputInfo 并在使用键时将 GetLastInputInfo 存储到另一个变量并比较结果。如果刻度比您的旧变量新得多,那么它很可能断开连接。这是一个很好的方法,但蜱可以从鼠标等其他东西上上升。在我的 Hook 类中没有鼠标钩子,因此当鼠标移动时我无法存储滴答计数的变量。所以现在我最终让它创建了一个新的钩子类实例并再次钩子。如果存储的刻度比​​新的刻度早 10000 刻度,它会每秒检查一次。

可以继续创建新的 Hooks 实例吗?它会不断地保持 Hooking/Unhooking,我想知道这是否会成为 Windows 的问题。

另外,如果有人有其他方法来检测挂钩是否断开,请告诉我将解决整个麻烦。

【问题讨论】:

  • 嗯,不要那样做。如果这是机器上的结构问题,只需提高超时值即可。 HKEY_CURRENT_USER\Control Panel\Desktop\LowLevelHooksTimeout 值。
  • 我不能,这将安装在其他客户端机器上。
  • 那听起来好像是你的程序有问题。永远不要让 UI 线程死机超过一秒钟。应该很容易识别,Windows 将主窗口替换为 3 秒后显示“无响应”的幽灵窗口。解决这个问题,丢失的钩子也会自动解决。
  • 死了是什么意思?什么时候进入无响应模式?

标签: vb.net


【解决方案1】:

在后台线程中进行 3D 渲染。 Control.Invoke 仅用于直接访问 UI 控件的代码。

或者,您可以将渲染拆分为非常小的部分,并将它们作为消息发布给自己,以便在主线程上处理。这样您就可以处理内部和外部消息。

在这两种情况下,您的应用程序都会及时响应,Windows 没有理由认为它没有响应,并且您的键盘快捷键将保持不变。

【讨论】:

    猜你喜欢
    • 2011-11-23
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2022-09-24
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    相关资源
    最近更新 更多