C++ 挂起低级钩子(winapi)的最佳方法

C++ 挂起低级钩子(winapi)的最佳方法,c++,winapi,hook,keyboard-hook,mouse-hook,C++,Winapi,Hook,Keyboard Hook,Mouse Hook,我想知道,在效率(cpu/内存使用)方面,暂时挂起/绕过低级鼠标/键盘挂钩的最佳方式是什么 我找到的当前解决方案是在示例中设置一个全局变量“doHook”,在hook过程中测试它,如果没有设置,就让它通过CallNextHookEx,如下所示: if ((nCode < 0) || (!doHook)) { return CallNextHookEx(NULL, nCode, wParam, lParam); } if((nCode

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

我找到的当前解决方案是在示例中设置一个全局变量“doHook”,在hook过程中测试它,如果没有设置,就让它通过CallNextHookEx,如下所示:

    if ((nCode < 0) || (!doHook))
    {
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
if((nCode<0)| |(!doHook))
{
返回CallNextHookEx(NULL、nCode、wParam、lParam);
}
这是一个好的解决方案吗?更好的方法

谢谢

您有两种选择:

  • 通过调用完全移除挂钩
  • 将吊钩留在原位,跳过正常操作
低级别和钩子的成本有些高,因为它们引入了额外的上下文开关来处理输入事件:

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


基本上,对于所有输入事件,您的do nothing钩子仍然使用数千个时钟周期进行上下文切换。为了最小化整体影响,你应该考虑完全卸载钩子并在必要时重新安装它。

对于我当前正在做的程序,我需要以光速启用钩子,所以我认为完全卸载和重新安装钩子不是一种选择,因为我认为重启比用我的慢得多。解决方案(或者可能没有我想象的那么慢?)。我想到了另一个解决方案:难道不可能创建一个专门用于钩子的线程,然后挂起/暂停它,然后继续它吗?(我对线程还是很陌生)难道不可能吗?挂起的线程就是:一个不会被安排执行的线程。在执行钩子链时,没有任何工具可以跳过这个特定的线程。由于您关心性能,您可能应该使用探查器来测量当前性能,比较不同的实现,并做出明智的决策。