如何正确使用SetWindowsHookEx和CallNextHookEx
我可以正确设置一个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(...); ... } 那么,如果代码不是我感兴趣的代码,那么钩子程序会发生什么?我怎么称呼下一个钩子? 编辑:主要问题是从SetWindowsHookEx返回HHOOK,需要将其传递给CallNextHookEx函数. 更新:似乎在NT平台上忽略了hook参数:
根据文档,正确的做法是将您收到的参数直接传递给CallNextHookEx,就像您收到它们一样.无论您是否决定处理挂钩消息,都应该调用CallNextHookEx.
According to MSDN,在NT / XP / 2003上忽略CallNextHookEx的第一个参数,对于较旧的基于Win95的操作系统,它应该是您在使用SetWindowsHookEx注册挂钩时收到的HHOOK.文档没有为Windows 2000指定值,但由于它是NT系列的一部分,因此合理的猜测是它也被忽略了. 鉴于此,为NT系列操作系统编写方法的好方法可能是: LRESULT CALLBACK CBTProc( int code,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的返回. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 身份验证 – 我对选择性身份验证的双向信任似乎与单向信任相
- windows-xp – 找到瓶颈:Windows XP上的磁盘I / O.
- .net – PresentationCore.dll中出现’System.StackOverflo
- ExtJs面板 – 添加动态组件
- 如何使用本机Win32 API从聚焦窗口中获取所选文本?
- Windows Azure Powershell部署错误 – “远程服务器返回了意
- 读取NTFS的USN(获取文件的历史操作记录,即使这个文件已被
- 将本机uint8_t(Java字节)转换为int
- Windows SDK和Linux版本的Android SDK之间是否存在差异?
- 有任何Windows记录器工具可以跟踪文件操作吗?
- 在Windows上托管node.js应用程序的最佳方法是什么
- windows-phone-7 – 如何禁用Windows Phone 7中列
- windows – 使用Powershell在远程计算机上启动GU
- windows-phone-7 – 虽然我有一个PeriodicTask和
- windows-server-2008 – 将用户名/密码指定为UNC
- windows – Delphi:如何设置(写入)扩展文件属性
- 测试 – Browserstack Win7 IE10不播放HTML5视频
- 如何创建(32位).NET应用程序以使用3 GB RAM?
- 查看IIS里每个站点的资源使用情况
- windows – 在cygwin的参数中调用带分号的批处理