我可以正确地build立一个窗口钩子,但我被MSDN中的线路困惑,说:“调用CallNextHookEx函数链接到下一个钩子程序是可选的,但强烈build议;否则,其他应用程序已经安装钩子不会收到挂钩通知,并可能导致错误行为,除非您绝对需要阻止其他应用程序看到通知,否则应该调用CallNextHookEx。“
我想成为一名好的编程公民,并打电话给下一个钩子。 但是,我的钩子程序看起来像这样:
LRESULT CALLBACK CBTProc(int code, WPARAM wp, LPARAM lp) { if (code != HCBT_CREATEWND) { // What do I do here? It's not the event I requested so how do I pass it on? return 0; } // It's the code we want (create window) CallNextHookEx(...); ... }
那么,如果代码不是我感兴趣的代码,那么在钩子程序中会发生什么? 我如何打电话给下一个钩子?
编辑:主要的问题是一个HHOOK从SetWindowsHookEx返回,并且需要传递给CallNextHookEx函数。
更新:看来在NT平台上钩参数被忽略:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/
根据文档,正确的做法是将收到的参数直接传递给CallNextHookEx,正如您收到的那样。 无论您是否决定处理挂钩消息,还应该调用CallNextHookEx。
根据MSDN , CallNextHookEx
的第一个参数在NT / XP / 2003上被忽略,对于基于Win95的早期操作系统,它应该是你在SetWindowsHookEx
注册钩子时收到的SetWindowsHookEx
。 文档没有为Windows 2000指定一个值,但是由于它是NT系列的一部分,所以合理的猜测是它也被忽略了。
鉴于以上所述,为NT系列操作系统编写方法的好方法可能是:
LRESULT CALLBACK CBTProc( int code, WPARAM wp, LPARAM lp ) { if( code == HCBT_CREATEWND ) ProcessCreateWnd( wp, lp ); return CallNextHookEx( 0, code, wp, lp ); } void ProcessCreateWnd( WPARAM wp, LPARAM lp ) { // my code here }
这样可以确保在处理结束时始终调用钩子,并且很难无意中添加将绕过CallNextHookEx
的return
。