转:容易产生误解的CallNextHookEx函数

      转自:http://www.cnblogs.com/grenet/archive/2010/12/08/1900169.html

  CallNextHookEx函数,从字面的理解就是调用后面一个钩子函数。若后面已经没有钩子函数呢?很多人都会错误的认为将会将消息传递给Window的消息处理函数。他们认为,消息的处理流程如下面所示:假设有4个钩子函数,分别为钩子A、钩子B、钩子C、钩子D

  物理击键

   ↓

  钩子A

   ↓

  钩子B

   ↓

  钩子C

   ↓

  钩子D

   ↓

  Window的消息处理函数

  他们认为,四个钩子函数中只要有一个返回1(非0),将会中止消息的传递。甚至在钩子函数中不调用CallNextHookEx函数也会阻止消息的传递。甚至认为,修改CallNextHookEx函数的参数就能更改按键消息的传递。

  遗憾的是,这个思路是不对的。

  你可以在钩子函数中删除CallNextHookEx函数的调用,会发现Window还是得到了按键的消息。你也可以尝试修改CallNextHookEx函数的参数,看看会有什么效果。我这样尝试后,直接报错(甚至有莫名的退出)。

  再回过头来看看CallNextHookEx函数,发现它仅仅是调用下一个钩子函数,只是在钩子函数间传递信息。

  正确的消息处理流程应该如下:还是以上面的事例为例。

  物理击键

   ↓

  钩子管理函数←→钩子A←→钩子B←→钩子C←→钩子D

   ↓

  Window消息处理函数

 

  在钩子A函数中,如果调用CallNextHookEx函数,则会将按键消息传给钩子B;如果不调用CallNextHookEx函数,则钩子B不会得到按键消息,换句话说,钩子B失效了,当然此时的钩子C和钩子D也失效了。为了钩子间和平相处,还是应该在钩子函数里添加CallNextHookEx函数的调用。

 

  再说说钩子函数的返回值的问题。在上面的事例中,钩子A的返回值决定按键消息是否丢弃。返回值0,告诉系统,消息继续传递给Window消息处理函数;返回值1(非0),告诉系统,消息将丢弃,Window消息处理函数得不到按键的消息。

 

  所以说,如果只是统计按键的信息

  在钩子函数中的最后直接调用

  Return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)

  由后面的钩子函数来决定是否丢弃该消息。(大家和平相处)

 

  如果是屏蔽按键

  在钩子函数中进行判断,满足要求后直接

  CallNextHookEx(hKeyboardHook, nCode, wParam, lParam)  

  Return 1

  告诉系统,丢弃该消息。当然出于礼貌,在之前还是调用CallNextHookEx函数,以便其他的钩子函数处理该消息

 

  至于修改按键(映射按键),修改参数,调用CallNextHookEx函数是没有用的。因为原本的消息根本就没有修改,你改的只是传给其他钩子函数的消息。而且还非常容易出错。

  关于如何修改按键,将在后文介绍。
  

  

作者: 万仓一黍
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值