当你创建一个钩子时,WINDOWS系统会创建一个数据结构,该结构包含了您创建的钩子的信息,安装钩子则是把该结构体插入到系统钩子列表中去,注意:新插入的放置到旧的前面。当指定的钩子事件被触发后,局部钩子只需要调用进程中的钩子函数来预处理事件,全局钩子则需要把处理插入到其他地址空间,要做到这一点,就需要有一个动态连接库,把钩子函数放到库中。但有两个是例外,就是日志钩子和日志回放钩子,它是一种比较特殊的钩子,它可以挂载到系统范围内的任何进程中,而且不需要另外编写一个dll来映射到其他进程的内存空间之中(关于日志钩子,以后有机会再详细介绍)。
一、钩子的分类:
安装不同的钩子,可以截获监视不同的消息类型,有针对的对所需要的消息进行过滤和处理,钩子主要分以下几类:
WH_CALLWNDPROC 发送到窗口的消息。由SendMessage触发
WH_CALLWNDPROCRET 发送到窗口的消息。由SendMessage处理完成返回时触发
WH_GETMESSAGE 发送到窗口的消息。GetMessage或PeekMessage触发
WH_KEYBROAD 键盘钩子,键盘触发消息。WM_KEYUP或WM_KEYDOWN消息
WH_KEYBROAD_LL 地层键盘钩子
WH_MOUSE 鼠标钩子,查询鼠标事件消息
WH_MOUSE_LL 低层键盘钩子
WH_HARDWARE 非鼠标、键盘消息时
WH_MSGFILTER 对话框、菜单或滚动条要处理一个消息时。该钩子是局部的。
WH_SYSMSGFILTER 同WH_MSGFILTER一样,系统范围的。
WH_DEBUG 调试钩子,用来给钩子函数除错
WH_JOURNALRECORD 监视和记录输入事件
WH_JOURNALPLAYBACK 回放用WH_JOURNALRECORD记录事件
WH_SHELL 外壳钩子,当关于WINDOWS外壳事件发生时触发. WH_CBT 当基于计算机的训练(CBT)事件发生时
WH_FOREGROUNDIDLE 前台应用程序线程变成空闲时候,钩子激活。
二、钩子的类型:
全局钩子:全局钩子可以挂钩其他进程的事件,有两种:基于线程的,它将捕获其它进程中某一特定线程的事件。简言之,就是可以用来观察其它进程中的某一特定线程将发生的事件。2,系统范围的,将捕捉系统中所有进程将发生的事件消息。
局部钩子:仅钩挂您自己进程的事件。
三、安装钩子:
SetWindowsHookEx
函数原形:HHOOK SetWindowsHookEx(
int idHook, // 钩子类型,见[一]
HOOKPROC? lpfn, // 钩子函数地址
INSTANCE hMod, // 钩子所在的实例的句柄,
DWORD???? dwThreadId // 钩子所监视的线程的线程号
)
hMod: 对于线程序钩子,参数传NULL;对于系统钩子:参数为钩子DLL的句柄
dwThreadId:对于全局钩子,该参数为NULL。
返回:成功:返回SetWindowsHookEx返回所安装的钩子句柄;
失败:NULL;
四、卸载钩子:
UnhookWindowsHookEx
函数原形:BOOL UnhookWindowsHookEx(
HHOOK hhk // 要卸载的钩子句柄。
)
五、钩子函数:
MyHookProc
钩子函数是回调函数。当安装的钩子被钩到指定的事件消息后,系统会自动调用钩子函数进行处理。
定义如下:
LRESULT WINAPI MyHookProc(
int nCode , // 指定是否需要处理该消息
WPARAM wParam, // 包含该消息的附加消息
LPARAM lParam // 包含该消息的附加消息
)
六、调用下一个钩子
CallNextHookEx
既然WINDOWS的钩子结构都保存在一个链表里边,很明显,消息将会被一个个往下传递,最后到达目标窗口,所以,我们处理了以后,由责任将消息传递给下一个钩子。当然你也可以不,但我还是建议您继续传递下去。
函数定义如下:
LRESULT CallNextHookEx(
HHOOK hhk, // 是您自己的钩子函数的句柄。用该句柄可以遍历钩子链
int nCode, // 把传入的参数简单传给CallNextHookEx即可
WPARAM wParam, // 把传入的参数简单传给CallNextHookEx即可
LPARAM lParam // 把传入的参数简单传给CallNextHookEx即可
)
分享到:
相关推荐
钩子函数的使用 钩子函数是 Windows 操作系统中的一种事件处理机制,它允许开发者在事件到达应用程序前拦截和处理事件。钩子函数可以分为两类:特定线程钩子和全局系统钩子。特定线程钩子只监视指定的线程,而全局...
回调函数和钩子函数是编程中常用的技术概念,下面我们将详细地介绍它们的概念、定义、特点和使用方法。 一、回调函数 回调函数是一个函数,它不能被显式调用,而是将其地址作为参数传递给另一个函数,以便在需要时...
钩子函数介绍** 钩子函数是Windows编程中的一种回调函数,当特定的事件(如键盘输入、鼠标点击或特定API调用)发生时,Windows会调用这个函数。根据钩子类型的不同,可以拦截各种事件。常见的钩子类型有: - **WH_...
使用钩子函数时,开发者需要通过`SetWindowsHookEx`函数注册钩子,并指定钩子类型、处理函数、所属线程以及模块句柄。当钩子被触发时,系统会调用提供的处理函数。需要注意的是,为了确保钩子能够正确工作,必须确保...
在这个"使用APIHook钩子截获你的应用程序调用的任何输入函数.zip"压缩包中,包含了以下文件: - **HookImportFunction.cpp**:这是实现APIHook的具体代码。它可能包含设置和解除钩子的逻辑,以及处理被钩子函数截获...
【编写钩子程序实例】钩子函数、安装钩子和卸载钩子是Windows编程中用于拦截和处理系统事件的关键技术。以下是对这些概念的详细解释: **定义钩子函数** 钩子函数是Windows API中一种特殊的回调函数,它允许程序员...
通过学习这个实例源码,你可以理解如何在Delphi中有效地利用钩子技术。 9. **学习与调试**:学习这个实例源码,你可以深入理解Windows消息机制,提升你的Delphi编程技能。同时,使用调试工具如DebugView或Visual ...
在IT领域,钩子函数(Hook Function)是一种高级技术,用于拦截系统消息或者特定事件,以便在这些事件发生时执行自定义的操作。钩子函数在Windows编程中特别常见,通过注册钩子,开发者可以监控系统级的行为,如键盘...
在IT领域,钩子函数(Hook Function)是一种高级技术,常用于系统监控、调试和拦截特定事件。在C++编程中,我们可以利用钩子来跟踪和控制程序的行为,例如在这个场景下,我们关注的是文件复制操作。"copy hook"特指...
描述中提到的“程序经过我调试过,很不错”,可能是指包含在压缩包中的"钩子函数使用"文件,这可能是一个示例项目或者代码库,展示了如何在实际工程中应用钩子技术。通过分析和运行这些代码,开发者可以直观地了解...
总的来说,DLL和钩子函数是Windows编程的核心技术,它们提供了丰富的功能和灵活性,帮助开发者实现各种复杂的系统级任务。通过深入学习和实践,你将能够自如地驾驭这两个工具,为你的项目增添无限可能。
### 钩子函数在VC++中的应用 ...通过合理地使用钩子函数,开发者可以实现对系统消息的精准控制,进而提升应用程序的功能性和灵活性。希望本文能够帮助初学者更好地理解和掌握钩子函数的基本原理及其应用场景。
而钩子函数则是一种Windows API技术,可以让我们在系统级别捕获特定事件,比如键盘输入。 1. **实现屏蔽键盘输入**: 要在WPF应用中屏蔽键盘输入,我们通常会使用低级键盘钩子(Low-Level Keyboard Hook)。通过...
在VB(Visual Basic)编程中,钩子函数是一种强大的技术,允许程序员监控系统或应用程序的特定事件。本文将深入探讨钩子函数的概念、工作原理以及如何在VB中使用它们,特别是通过`SetWindowsHook` API函数的应用。...
钩子函数是Windows操作系统中一种强大的技术,它允许程序员拦截和处理系统中的特定事件,如键盘输入、鼠标点击等。通过安装钩子,开发者可以在事件发生时执行自定义代码,实现对系统行为的扩展或监控。 **1. 钩子...
通过阅读和理解这段代码,你可以更好地掌握如何在实际应用中使用钩子技术来监听和响应键盘鼠标事件。 总之,钩子函数是Windows编程中的一种强大工具,通过它可以深入到系统内部,对用户输入事件进行实时监控。理解...
键盘钩子函数是一种在Windows操作系统中广泛使用的编程技术,它允许程序监视并处理其他应用程序的键盘输入事件。这种技术基于Windows消息机制,通过安装钩子(Hook)来拦截特定类型的系统消息,例如键盘输入消息。当...
4. **设置远程钩子**: 使用SetWindowsHookEx函数在目标进程的主线程中安装钩子。这个函数需要进程句柄、线程ID、钩子类型以及钩子函数的地址。由于钩子函数在我们的DLL中,我们需要确保DLL已经被目标进程加载。 5. ...
下面将详细介绍钩子函数的工作原理以及如何实现键盘失灵的效果。 首先,我们要了解什么是钩子函数。在Windows操作系统中,钩子是通过安装一个特殊的回调函数来实现的,这个函数会在特定类型的事件发生时被系统调用...