Mar*_*ram 8 windows hook winapi
我可以正确设置一个Windows挂钩,但我对MSDN中的行"混淆"说"调用CallNextHookEx函数链接到下一个挂钩程序是可选的,但强烈建议;否则,其他已安装挂钩的应用程序将没有收到钩子通知,结果可能表现不正确.你应该调用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(...);
...
}
Run Code Online (Sandbox Code Playgroud)
那么,如果代码不是我感兴趣的代码,那么钩子程序会发生什么?我怎么称呼下一个钩子?
编辑:主要问题是从SetWindowsHookEx返回一个HHOOK,需要将其传递给CallNextHookEx函数.
更新:似乎在NT平台上忽略了hook参数:
http://msdn.microsoft.com/en-us/library/ms644974.aspx
http://www.klenotic.com/pl/null_hhook/
Cha*_*lie 10
根据文档,正确的做法是将您收到的参数直接传递给CallNextHookEx,就像您收到它们一样.无论您是否决定处理挂钩消息,都应该调用CallNextHookEx.
根据MSDN,CallNextHookEx在NT/XP/2003上忽略了第一个参数,对于较旧的基于Win95的操作系统,它应该是HHOOK您在注册挂钩时收到的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
}
Run Code Online (Sandbox Code Playgroud)
这样可以确保在处理结束时始终调用挂钩,并且很难意外添加return会绕过的钩子CallNextHookEx.
| 归档时间: |
|
| 查看次数: |
19960 次 |
| 最近记录: |