SetWindowsHookEx详解

简介:

SetWindowsHookEx详解

  606人阅读  评论(0)  收藏  举报
http://apps.hi.baidu.com/share/detail/23903142
SetWindowsHookEx详解
2010-06-17 18:21
函数功能:该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关.
函数原形:HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId );
参数:
idHook:指示欲被安装的挂钩处理过程之类型,此参数可以是以下值之一:
WH_CALLWNDPROC(4): 安装一个挂钩处理过程,在系统将消息发送至目标窗口处理过程之前,对该消息进行监视,详情参见CallWndProc挂钩处理过程.
WH_CALLWNDPROCRET(12) :安装一个挂钩处理过程,它对已被目标窗口处理过程处理过了的消息进行监视,详情参见 CallWndRetProc 挂钩处理过程.
WH_CBT(5) :安装一个挂钩处理过程,接受对CBT应用程序有用的消息 ,详情参见 CBTProc 挂钩处理过程.
WH_DEBUG(9):安装一个挂钩处理过程以便对其他挂钩处理过程进行调试, 详情参见DebugProc挂钩处理过程.
WH_FOREGROUNDIDLE(11):安装一个挂钩处理过程,该挂钩处理过程当应用程序的前台线程即将进入空闲状态时被调用,它有助于在空闲时间内执行低优先级的任务.
WH_GETMESSAGE(3):安装一个挂钩处理过程对寄送至消息队列的消息进行监视,详情参见 GetMsgProc 挂钩处理过程.
WH_JOURNALPLAYBACK(1):安装一个挂钩处理过程,对此前由WH_JOURNALRECORD 挂钩处理过程纪录的消息进行寄送.详情参见 JournalPlaybackProc挂钩处理过程.
WH_JOURNALRECORD(0):安装一个挂钩处理过程,对寄送至系统消息队列的输入消息进行纪录.详情参见JournalRecordProc挂钩处理过程.
WH_KEYBOARD(2):安装一个挂钩处理过程对击键消息进行监视. 详情参见KeyboardProc挂钩处理过程.
WH_KEYBOARD_LL(13):此挂钩只能在Windows NT中被安装,用来对底层的键盘输入事件进行监视.详情参见LowLevelKeyboardProc挂钩处理过程.
WH_MOUSE(7):安装一个挂钩处理过程,对鼠标消息进行监视. 详情参见 MouseProc挂钩处理过程.
WH_MOUSE_LL(14):此挂钩只能在Windows NT中被安装,用来对底层的鼠标输入事件进行监视.详情参见LowLevelMouseProc挂钩处理过程.
WH_MSGFILTER(-1):安装一个挂钩处理过程, 以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.详情参见MessageProc挂钩处理过程.
WH_SHELL(10):安装一个挂钩处理过程以接受对外壳应用程序有用的通知, 详情参见 ShellProc挂钩处理过程.
WH_SYSMSGFILTER(6):安装一个挂钩处理过程,以监视由对话框、消息框、菜单条、或滚动条中的输入事件引发的消息.这个挂钩处理过程对系统中所有应用程序的这类消息都进行监视.详情参见 SysMsgProc挂钩处理过程.
lpfn:指向相应的挂钩处理过程.若参数dwThreadId为0或者指示了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个动态链接中的挂钩处理过程.否则,参数lpfn可以指向一个与当前进程相关的代码中定义的挂钩处理过程.
hMod:指示了一个动态链接的句柄,该动态连接库包含了参数lpfn 所指向的挂钩处理过程.若参数dwThreadId指示的线程由当前进程创建,并且相应的挂钩处理过程定义于当前进程相关的代码中,则参数hMod必须被设置为NULL(0).
dwThreadId:指示了一个线程标识符,挂钩处理过程与线程相关.若此参数值为0,则该挂钩处理过程与所有现存的线程相关.
返回值:若此函数执行成功,则返回值就是该挂钩处理过程的句柄;若此函数执行失败,则返回值为NULL(0).若想获得更多错误信息,请调用GetLasError函数.
备注:若参数hMod为NULL,而参数dwThreadld为0或者指示了一个其他进程创建的线程标识符,则会产生错误.
对函数CallNextHookEx进行调用以下链接下一个挂钩处理过程是可选的,但也是被推荐的否则,其他安装了此挂钩的应用程序将无法获得此挂钩通知,从而可能导致错误的行为.除非您确实希望防止其他应用程序看到此挂钩通知,您应当调用函数CallNextHookEx.
在终止一个应用程序之前,必须调用函数UnhookWindowsHookEx以释放与此挂钩相关的系统资源.
挂钩的作用域依赖与挂钩的类型.一些挂钩只能被设置成系统作用域,其他挂钩(如下所示)还可以被设置为某一特定线程的作用域:
WH_CALLWNDPROC 线程或系统
WH_CALLWNDPROCRET 线程或系统
WH_CBT 线程或系统
WH_DEBUG 线程或系统
WH_FOREGROUNDIDLE 线程或系统
WH_GETMESSAGE 线程或系统
WH_JOURNALPLAYBACK 系统
WH_JOURNALRECORD 系统
WH_KEYBOARD 线程或系统
WH_KEYBOARD_LL 线程或系统
WH_MOUSE 线程或系统
WH_MOUSE_LL 线程或系统
WH_MSGFILTER 线程或系统
WH_SHELL 线程或系统
WH_SYSMSGFILTER 系统
对于一个特定的挂钩类型,现成的挂钩先被调用,然后才是系统挂钩被调用.
系统挂钩作为共享资源,安装一次就对所用应用程序产生影响.所有的系统挂钩函数必须在库中.系统挂钩应当被限制用于一些特殊用途的应用程序或者用来作为应用程序调试的辅助工具.不再需要挂钩的库应当将相应的挂钩处理过程删除掉.
速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件:用户自定义,Unicode,在Windows NT上实现了Unicode和ANSI的版本.
ShellProc
函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用.此函数从系统接受外壳(shell)通知.类型HOOKPROC定义了指向此类回调函数的指针.ShellProc时应用程序或库中定义的相应回调的位置标志符.
函数原形:LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam,LPARAM lParam );
参数:
nCode:指示挂钩类型,该参数可以是以下值之一:
HSHELL_ACCESSIBILITYSTATE: 对Windows NT5.0或以上版本有效,指示"可访问性"已被改变.
HSHELL_ACTIVATESHELLWINDOW: shell应当激活其主窗口.
HSHELL_GETMINRECT: Windows 95 only: 一个窗口正在被最小化或者最大化,系统需要该窗口被最小化时的矩形坐标.
HSHELL_LANGUAGE : Windows 95 only: 键盘语言被改变或者一个新的键盘布局被加载.
来源:( http://blog.sina.com.cn/s/blog_626a27090100f0m3.html) - 钩子函数大全_老代码_新浪博客
HSHELL_REDRAW: Windows 95 only: 一个窗口在任务条上的标题已被重画.
HSHELL_TASKMAN: Windows 95 only: 用户已选择其任务列表.一个提供了任务的列表的shell应用程序当返回TRUE,以阻止Windows开始(执行)其任务列表.
HSHELL_WINDOWACTIVATED: Windows 95 only: 激活状态已被转移给一个不同的顶层无属性主窗口.
HSHELL_WINDOWCREATED: 一个顶层无属性主窗口已被创建.当系统调用一个SheProc函数时,该窗口存在.
HSHELL_WINDOWDESTROYED:一个顶层无属性主窗口即将销毁.当系统调用SheProc 函数时.该窗口仍然存在.
若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数CallNextHookEx 并返回其返回值.
wParam: 此参数的值依赖于参数nCode,其依赖关系如下所示:
HSHELL_ACCESSIBILITYSTATE: 指示哪一个可以访问特征已被改变了状态,可以是以下值之一:
ACCESS_FILTERKYS,ACCESS_MOUSEKEYS,ACCESS_STICKKEYS.
HSHELL_GETMINRECT:被最小化或者最大化的窗口句柄.HSHELL_LANGUAGE: 窗口的句柄.
HSHELL_REDRAW:被重画的窗口的句柄.HSHELL_WINDOWACTIVATED:被激活的窗口的句柄.
HSHELL_WINDOWCREATED:被创建的窗口的句柄.HSHELL_WINDOWDESTROYED:被销毁的窗口的句柄.
lParam:此参数的值依赖于参数nCode,其依赖关系如下所示:
HSHELL_GETMINRECT:指向该RECT结构的指针. HSHELL_LANGUAGE: 键盘布局的句柄.
HSHELL_REDRAW: 若该窗口正在闪现,则其值为TRUE,否则为FALSE.
HSHELL_WINDOWACTIVATED: 若该窗口是全屏模式,则其值为TRUE,否则为FALSE.返回值:返回值应为0.
备注:此挂钩处理过程通过调用函数SetWindowsHookEx ,指定WH_SHLL挂钩类型及其相应挂钩处理过程首地址来安装.
速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件,用户自定义.
SysMsgProc
函数功能:挂钩处理过程是应用程序或库中定义的回调函数,它与函数 SetWindowsHookEx搭配使用.当一个对话框、消息框、菜单条、或滚动条中的输入事件发生,且由此引发的消息尚未被处理之前,系统对此挂钩处理过程进行调用.此函数可以对系统中所有的对话框、消息框、菜单条、或滚动条消息进行监视.
类型HOOKPROC定义了指向此类回调函数的指针.SysMsgProc 是库中相应回调函数名的位置标志符.
函数原形:LRESULT CALLBACK SysMsgProc(int nCode,WPARAM wParam,LPARAM lParam);
参数:
nCode:指示产生此消息的输入事件类型.此参数可以是以下值之一:
MSGF_DIALOGBOX: 输入事件由一个消息框或者对话框产生.
MSGF_MENU: 输入事件由一个菜单条产生.
MSGF_SCROLLBAR: 输入事件由一个滚动条产生.
MSGF_NEXTWINDOW: 输入事件由于用户摁下组合键<Alt+Tab>以激活另一个窗口而产生.
若nCode的值小于0,则此挂钩处理过程必须将该消息不加处理地传送给函数 CallNextHookEx 并返回其返回值.
wParam: 为NULL(0).
lParam: 指向MSG结构的[指针].
返回值:若nCode的值小于0,则此挂钩处理过程必须返回CallNextHookEx 的返回值.若nCode的值大于或等于0,并且此挂钩处理过程未对该消息进行处理,则调用函数CallNextHookEx 并返回其返回值是被推荐的.否则,其他安装了WH_SYSMSGFILTER挂钩的应用程序将无法收到此挂钩通知,并可能由此导致错误的行为.若此挂钩处理过程处理了此消息,它应返回一个非零值以避免系统再将此消息传送给目标窗口处理过程.
备注:一个应用程序通过调用函数SetWindowsHookEx 指定 WH_SYSMSGFILTER挂钩类型及相应挂钩处理过程首地址来安装此挂钩.
速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件winuser.h,库文件,用户自定义.
UnhookWindowsHookEx
函数功能: 该函数将一个由SetWindowsHookEx 安装的挂钩处理过程从挂钩链中删除.
函数原形: BOOL UnhookWindowsHookEx(HHOOK hhk);
参数:
hhk: 被删除的挂钩的句柄.此参数是一个挂钩句柄,该句柄是此前函数SetWindowsHookEx的返回值.
返回值:该函数执行成功返回非0值,失败返回0.
备注:即使UnhookWindowsHookEx 函数返回之后,该钩子处理过程也可能正处于被其它线程调用的状态.若当前未调用该钩子处理过程,则在 UnhookWindowsHookEx 函数返回之前该钩子处理过程被立即删除.
DelHookProc:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数CallNextHookEx.
SetWindowsHook:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数SetWindowsHookEx.
UnhookWindowsHook:该函数已过时,它仅仅是用来与Windows的16位版本兼容.在32位Windows系统中应当使用函数UnhookWindowsHookEx.
CallMsgFilter
函数功能:该函数将特定消息和挂钩代码发送给与挂钩 WH_SYSMSGFILTER和WH_MSGFILTER 相联系的挂钩处理过程,一个 WH_SYSMSGFILTER 或者 WH_MSGFILTER挂钩处理过程是指应用程序定义的回调函数,这些回调函数负责检查,并可有选择地修改关于对话框、消息框、菜单条、滚动条的消息。
函数原形:BOOL CallMsgFilter(LPMSG lpMsg, int nCode);
参数:
lpMsg:指向一个MSG结构,该结构包含发送给挂钩处理过程的消息.
nCode:指定挂钩处理过程需要使用的应用程序定义的代码,以确定如何对消息进行处理,该代码切忌采用与系统预定义的与WH_SYSMSGFILTER和WH_MSGFILTER挂钩相关的挂钩代码(MSGF_ 和 HC_开头)相同的值.
返回值:若该应用程序可对消息作进一步处理,则返回值为0,若该应用程序不能对该消息作进一步处理,则返回值为非0值.
备注:系统对CallMsgFilter进行调用,以使得应用程序能够检查和控制在对对话框、消息框、菜单条、滚动条的内部处理过程中产生的,或是由用户按下<Alt+Tab>组合键以激活不同窗口时产生的消息流.
可通过调用函数SetWindowsHookEx来安装此挂钩处理过程.
速查:Windows NT:3.1以及以上版本,Windows :95以及以上版本,Windows CE 不支持,头文件:winuser.h,库文件:user32.lib,Unicode:在Windows NT上实现了Unicode和ANSI的版本.


本文转自 bilinyee博客,原文链接: http://blog.51cto.com/215363/915181        如需转载请自行联系原作者     
相关文章
|
7月前
|
存储 并行计算 Java
Python读取.nc文件的方法与技术详解
本文介绍了Python中读取.nc(NetCDF)文件的两种方法:使用netCDF4和xarray库。netCDF4库通过`Dataset`函数打开文件,`variables`属性获取变量,再通过字典键读取数据。xarray库利用`open_dataset`打开文件,直接通过变量名访问数据。文中还涉及性能优化,如分块读取、使用Dask进行并行计算以及仅加载所需变量。注意文件路径、变量命名和数据类型,读取后记得关闭文件(netCDF4需显式关闭)。随着科学数据的增长,掌握高效处理.nc文件的技能至关重要。
1306 0
|
人工智能 大数据
1+X大数据分析与应用中级备考经验
作为上海城建职业学院人工智能应用学院大数据技术专业的专任教师,在2020年12月份指导学生参与阿里巴巴《1+X大数据分析与应用中级》考试中,取得了优异的成绩。34位参加考证的同学,共有27个同学通过了考试,再次分享备考经验,以供参考。
2560 2
1+X大数据分析与应用中级备考经验
|
4月前
|
人工智能 小程序 Java
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
本文介绍了一款名为PyWxDump的开源工具,它可以获取微信账户信息、解密SQLite数据库以查看和备份聊天记录。此工具适用于已登录电脑版微信的用户,通过GitHub下载后简单几步即可操作。适合对数据恢复感兴趣的开发者,但请注意合法合规使用并尊重隐私。
573 2
【工具】轻松解锁SQLite数据库,一窥微信聊天记录小秘密
|
6月前
|
应用服务中间件 uml
【UML】软件工程中常用图:类图、部署图、时序图、状态图
【UML】软件工程中常用图:类图、部署图、时序图、状态图
727 1
|
5月前
|
存储 Java 数据库
Spring Boot与分布式事务的最佳实践
Spring Boot与分布式事务的最佳实践
|
7月前
|
测试技术 数据库 开发者
Django自动化测试入门:单元测试与集成测试
【4月更文挑战第15天】本文介绍了Django的自动化测试,包括单元测试和集成测试。单元测试专注于单个视图、模型等组件的正确性,而集成测试则测试组件间的交互。Django测试框架提供`TestCase`和`Client`进行单元和集成测试。通过编写测试,开发者能确保代码质量、稳定性和应用的正确协同工作。运行测试使用`python manage.py test`命令,建议将其纳入日常开发流程。
|
弹性计算 网络安全 块存储
阿里云服务器包年包月收费模式有何区别(官方资料解答)
阿里云服务器收费模式包含包年包月、按量付费和抢占式实例三种模式,其中用户选择最多的是包年包月模式,本文汇总了阿里云服务器包年包月收费模式常见问题及答案,以供大家更详细的了解包年包月模式是如何收费的。
825 0
阿里云服务器包年包月收费模式有何区别(官方资料解答)
|
7月前
|
数据安全/隐私保护
Xshell怎么与云服务器连接(详细过程)
Xshell怎么与云服务器连接(详细过程)
448 0
|
机器学习/深度学习 Cloud Native 安全
1790. 仅执行一次字符串交换能否使两个字符串相等:简单模拟
这是 力扣上的 1790. 仅执行一次字符串交换能否使两个字符串相等 ,难度为 简单。
|
数据安全/隐私保护 C++ Python
【Python 百练成钢】使用Python实现密码登录器
【Python 百练成钢】使用Python实现密码登录器
【Python 百练成钢】使用Python实现密码登录器