【问题标题】:Best way to suspend low level hook (winapi)挂起低级钩子的最佳方法(winapi)
【发布时间】:2014-01-25 16:45:27
【问题描述】:

我想知道在效率(cpu/内存使用)方面,暂时挂起/绕过低级鼠标/键盘挂钩的最佳方法是什么。

我找到的当前解决方案是在示例中设置一个全局变量“doHook”,在 hook proc 中对其进行测试,如果没有设置,就让它像这样通过 CallNextHookEx 传递:

    if ((nCode < 0) || (!doHook))
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }

这是一个好的解决方案吗?更好的方法?

谢谢

【问题讨论】:

    标签: c++ winapi hook keyboard-hook mouse-hook


    【解决方案1】:

    你有两个选择:

    • 通过调用 UnhookWindowsHookEx 完全移除挂钩。
    • 将挂钩留在原位并跳过正常操作。

    低级别的keyboard 和mouse 钩子有些昂贵,因为它们引入了额外的上下文切换来处理输入事件:

    [...] 钩子没有注入到另一个进程中。相反,上下文切换回安装钩子的进程,并在其原始上下文中调用它。然后上下文切换回生成事件的应用程序。

    基本上,对于所有输入事件,您的无操作挂钩仍会占用数千个时钟周期来进行上下文切换。为了尽量减少整体影响,您应该考虑完全卸载挂钩并在必要时重新安装。

    【讨论】:

    • 对于我目前正在执行的程序,我需要以光速启用钩子,所以我认为完全卸载并重新安装钩子不是一种选择,因为我认为它要慢得多比我的解决方案重新启动(或者它可能没有我想的那么慢?)。我想到了另一种解决方案:是否可以创建一个专用于钩子的线程并暂停/暂停它然后恢复它? (我对线程还是很陌生)难道不应该吗?
    • 挂起的线程就是这样:一个不会被调度执行的线程。在执行钩子链时,没有任何工具可以跳过这个特定的线程。由于您关心性能,您可能应该使用分析器来衡量当前性能、比较不同的实现并做出明智的决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多