2014-01-25 31 views
0

我想知道从效率(CPU /内存使用情况)角度来说,暂时挂起/绕过低级别鼠标/键盘挂钩的最佳方法是什么。暂停低级别挂钩的最佳方法(winapi)

目前的解决方案,我发现是在为例来设置一个全局变量,“doHook”,在钩PROC测试,如果没有设置让它与CallNextHookEx方法传递这样的:

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

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

感谢

回答

2

你有2种选择:

  • 完全通过调用UnhookWindowsHookEx的勾去掉。
  • 将挂钩留在原位并跳过正常操作。

低电平keyboardmouse钩有些昂贵,因为它们引入用于处理输入事件的附加的上下文切换:

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

实质上,对于所有输入事件,您的执行无关钩仍会耗用数千个时钟周期来进行上下文切换。为了最大限度地减少整体影响,您应该考虑彻底卸载挂钩并在必要时重新安装。

+0

感谢您的信息。 –

+0

对于我目前正在执行的程序,我需要以光速启用钩子,所以我认为完全卸载并重新安装钩子不是一种选择,因为我认为重启要比我的解决方案慢得多(或者它可能不如我想象的那么慢?)。我想到了另一种解决方案:是不是可以创建一个专用于钩子的线程并暂停/暂停它然后恢复它? (我对线程还是比较新的)不应该有可能吗? –

+0

暂停的线程就是这样:一个不会被安排执行的线程。当执行一个钩子链时,没有设施会跳过这个特定的线程。由于您关心的是性能,您应该使用分析器来衡量当前的性能,比较不同的实现,并做出明智的决定。 – IInspectable