【问题标题】:Which way return HHOOK message to system is better?向系统返回 HHOOK 消息哪种方式更好?
【发布时间】:2014-01-02 16:21:47
【问题描述】:

我使用 WH_KEYBOARD_LL 挂钩并总是向系统返回消息
我想知道以下两种方式,哪个更好?我认为方式//1 的性能更好,因为它会立即将消息发送回系统,而//2 必须完成其内容然后发送回,但我看到几乎人们使用//2。帮我理解一下,谢谢!

HHOOK _l_hook

// 1
LRESULT __stdcall l_Callback(int nCode, WPARAM wParam, LPARAM lParam)
{
    CallNextHookEx(_l_hook, nCode, wParam, lParam);
    //Do stuff
    return 0;
}

// 2
LRESULT __stdcall l_Callback(int nCode, WPARAM wParam, LPARAM lParam)
{
    //Do stuff
    CallNextHookEx(_l_hook, nCode, wParam, lParam);
}

【问题讨论】:

  • 您应该根据文档返回调用CallNextHookEx 的结果。无论如何,这不应该太重要,因为 IIRC,钩子程序有一个特定的超时。
  • 由于您担心性能:没有可衡量的差异。无论如何,这两个版本都不遵守文档中规定的规则。
  • 文档说:一个钩子过程可以在处理钩子信息之前或之后调用这个函数。我会说最后坚持标准return CallNextHookEx(...),因为如果您的回调非常昂贵以至于首先或最后调用下一个钩子会产生任何真正的不同,那么您可能首先在那里做了太多工作(并且您可能希望通过队列或其他方式将其卸载到另一个线程,以保持回调快速简单)。

标签: c++ winapi return hook message


【解决方案1】:

它们都不正确。样板实现应该如下所示:

LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    if (nCode >= 0) {
       // do your stuff
       //...
    }
    return CallNextHookEx(_l_hook, nCode, wParam, lParam); 
}

你没有指定你实现的钩子的类型,所以如果你有任何理由改变模式是不可猜测的。始终以“不”为目标。如有疑问,请使用MSDN Library 中的代码示例。

【讨论】:

  • 我更新了我的问题,即WH_KEYBOARD_LL,我只需要关于击键的信息,从不从系统处理。
  • 您可以通过返回 -1 来过滤带有该钩子的键,而不是调用 CallNextHookEx()。它是可选的。我的回答还是不错的,可以双向处理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2013-06-08
相关资源
最近更新 更多