作者: linzhenqun(风)
时间: <chsdate w:st="on" isrocdate="False" islunardate="False" day="6" month="10" year="2005">2005-10-6</chsdate>
Blog: http://blog.csdn.net/linzhengqun
-----------------------------------------------------------------------------------------------------
前言
这不是关于钩子的长篇大论,而更关注于其实际应用。
不过实践总要有理论作为基础。因此本文第一部分给出了关于钩子的基本理论。大部分都直接翻译于MSDN,大家如果有兴趣可以找MDSN中的Win32 Hooks这篇文章来看,非常详尽的说明了钩子的应用,再看看对于那些API的声明,基本就OK了。
第二部分给出一个实际的程序,关于宏的实现,从这部分可以学到钩子的具体应用。第三部分会给出一个简单的SPY程序,理解全局钩子的应用。
(一)基本理论
钩子是Windows中是一项非常有用的技术。钩子是这样的一种机制:它允许一个函数在事件(消息,鼠标动作,键盘)到达应用程序之前截获它们。该函数可以作用于事件,某些情况下,可以修改和丢弃它们。接收事件的函数称为过滤函数,它将依照所截获事件的类型来分类。例如,一个过滤函数可能想要接收所有的键盘和鼠标事件。Windows要调用一个过滤函数,该函数必须被安装到一个Windows 钩子(比如,一个键盘钩子)上面。如果一个钩子附带有多个过滤函数,Windows维护一个过滤函数的链,最近安装的函数在链的前面,最先安装的则在链的后面。
钩子有很多种,这里不能一一列出,其他可以看MSDN:
- WH_CALLWNDPROC
- WH_CALLWNDPROCRET
- WH_GETMESSAGE
- WH_JOURNALPLAYBACK
- WH_JOURNALRECORD
- WH_KEYBOARD
- WH_MOUSE
这些钩子分别对应于系统中不同的事件,我们的程序可以使用钩子做很多的事情,比如:
l 处理和修改系统中的所有消息,无论GetMessage或PeekMessage何时被调用(WH_GETMESSAGE)。
l 处理和修改所有消息,无论SendMessage何时被调用(WH_CALLWNDPROC)。
l 记录和回放键盘和鼠标事件(WH_JOURNALRECORD, WH_JOURNALPLAYBACK)。
l 处理,修改或移除键盘事件(WH_KEYBOARD)。
l 处理,修改或丢弃鼠标事件(WH_MOUSE)。
等等。
对于我们的程序,要使用钩子,将用到下面几个重要的API函数:
SetWindowsHook, UnhookWindowsHook和CallNextHookEx,Windows使用这几个函数管理钩子的过滤函数链。下面我们将详细介绍:
SetWindowsHookEx
SetWindowsHookEx增加一个过滤函数到一个钩子中。该函数带有四个参数:
l 一个整型编码描述了那种过滤函数被附带上。这些码定义在WINUSER.H中。。
l 过滤函数的地址。在应用程序或DLL的模块定义文件中。
l 包含过滤函数的模块的实例句柄。
l 钩子被安装到某个线程的线程ID,如果线程ID不为零,安装了的过滤函数将只在特定线程的上下文中被调用。如果线程ID为空,则线程将在系统范围内或任何的线程上下文中被调用。一个库或应用程序可以使用GetCurrentThreadId获得当前线程ID。
SetWindowsHookEx返回安装的钩子的句柄(HHook), 程序在随后调用UnhookWindowsHookEx时要使用该句柄。
SetWindowsHookEx也返回一个值标识为什么调用失败,可以查看MSDN。
UnhookWindowsHookEx
要从一个钩子链中移除一个过滤函数,调用UnhookWindowsHookEx。该函数需要从SetWindowsHookEx中返回的句柄作为参数,并返回一个值以确定钩子是否删除。
过滤函数
钩子过滤函数是被附带到钩子的函数。过滤函数是由系统而不是由程序调用。
所有过滤函数必须有如下的形式:
LRESULT CALLBACK FilterFunc( nCode, wParam, lParam )
int nCode;
WORD wParam;
DWORD lParam;
所有过滤函数都返回一个LONG值。FilterFunc只是实际的过滤函数名的一个符号。
参数
过滤函数接收三个参数:nCode, wParamt和lParam。nCode是一个整值,它通知过滤函数任何应该知道附加数据。
当Windows传递一个负值的nCode给过滤函数时,应该调用CallNextHookEx并传递三个过滤函数的参数。过滤函数也必须返回CallNextHookEx返回的值。
第二个传递给过滤函数的参数,一个WPARAM类型,而第三个参数是LPARAM类型。这些参数传递过滤函数需要的信息。wParam和lParam对不同的钩子意义不同。
钩子 |
过滤函数 |
WH_CALLWNDPROC |
CallWndProc |
WH_GETMESSAGE |
GetMsgProc |
WH_JOURNALRECORD |
JournalRecordProc |
WH_JOURNALPLAYBACK |
JournalPlaybackProc |
WH_KEYBOARD |
KeyboardProc |
WH_MOUSE |
MouseProc |
WH_CALLWNDPROCRET |
CallWndRetProc |
其本质的差别就在于函数带的参数表示的意义。可以根据函数名查阅MSDN,以获得更详尽的描述。
分享到:
相关推荐
以下是对钩子机制及其应用的详细解释: 一、钩子的基本概念: 钩子是Windows操作系统提供的一种机制,允许开发者注册函数来接收并处理特定的消息或事件。当特定的事件发生时,如键盘输入、窗口消息、系统事件等,...
当用户按下或释放一个键时,Windows会先触发键盘钩子,然后再将事件传递到目标应用程序。这样,钩子程序就能在目标程序处理键盘输入之前捕获这些事件。 键盘钩子主要有两种类型:本地钩子(Local Hook)和全局钩子...
下面将详细介绍几种常用的钩子类型及其应用场景: ##### 1. 键盘钩子与低级键盘钩子 **键盘钩子**(Keyboard Hook)用于监控所有键盘消息,包括按键按下与释放等事件。通过这种钩子,开发者可以实现对用户键盘输入...
【标题】:深入理解钩子程序DLL及其在控制台中的应用 在Windows操作系统中,钩子(Hook)是一种系统机制,允许程序员监控特定事件的发生,例如键盘输入、鼠标操作等。钩子程序通常是一个动态链接库(DLL),它包含...
在IT领域,尤其是在Windows应用程序开发中,"键盘钩子"和"鼠标钩子"是用于监控和处理系统级输入事件的重要技术。这些技术通常涉及到低级别编程,特别是使用C#语言时,EventHook库提供了方便的接口来实现这一功能。本...
全局钩子是Windows编程中的一种技术,主要用于监控系统或应用程序中的特定事件,如键盘输入、鼠标操作、窗口创建等。这种技术通常涉及到Windows API函数,尤其是`SetWindowsHookEx`函数,它允许开发者注册一个钩子,...
总结起来,"hook_钩子程序-delphi"的主题涵盖了一个广泛的Delphi编程领域,涉及到Windows系统中的Hook技术及其在Delphi中的实现,这对于任何希望增强其应用程序功能或进行系统监控的开发者来说都是极其宝贵的资源。...
在这个“完整版键盘钩子.rar”压缩包中,我们将会深入探讨键盘钩子的核心原理、实现方式及其在实际应用中的具体运用。 键盘钩子,简单来说,是一种操作系统级别的机制,允许程序拦截并处理键盘输入事件。这一技术...
本文重点介绍用户空间钩子的技术细节及其应用场景。 #### 三、用户空间钩子(User Space Hook) 用户空间钩子是在用户态下实现的一种Hook技术,主要用于拦截和修改应用程序的行为。这种技术通常不涉及对操作系统核心...
### 钩子函数在VC++中的应用 #### 一、引言 在软件开发过程中,特别是对于Windows应用程序而言,钩子(Hook)技术是一种非常有用的工具,...希望本文能够帮助初学者更好地理解和掌握钩子函数的基本原理及其应用场景。
全局键盘钩子是Windows操作系统提供的一种机制,允许应用程序在系统层面捕获键盘事件,即使焦点不在该应用程序上。这种技术通常用于实现系统级...通过分析和学习这段代码,可以加深对全局键盘钩子及其实现细节的理解。
这种实践可以帮助理解钩子的工作原理及其在实际项目中的应用。 在文件"钩子函数"中,可能包含了创建和使用钩子函数的代码示例。通过阅读和分析这些代码,你可以更深入地了解如何在实际编程中设置和管理钩子,以及...
本文将详细探讨MFC中的进程钩子及其使用方法。 首先,让我们理解什么是进程钩子。进程钩子是安装在特定进程中的,当该进程中发生特定事件时,钩子函数会被调用。这使得开发者可以在事件发生时进行干预,实现自定义...
本篇文章将深入探讨消息钩子的实现及其在拦截`WM_COMMAND`消息中的应用。 首先,我们需要理解什么是`WM_COMMAND`消息。`WM_COMMAND`是Windows消息的一种,它在用户与菜单、快捷键、控件交互时产生,传递控制ID和...
它提供了一种声明式的接口,用户只需指定要挂钩的API函数及其替换函数即可。 3. **动态与静态钩子**:Ganxo支持动态和静态两种钩子方式。动态钩子在运行时注入代码,而静态钩子则在编译时完成,两者各有优缺点,...
系统钩子是Windows操作系统中的一种技术,它允许应用程序在系统层面监控和响应特定类型的事件。通过设置系统钩子,开发者可以捕获并处理系统中发生的各种事件,如键盘输入、鼠标活动、窗口创建和销毁等。这个压缩包...
#### 一、全局钩子的概念及其重要性 在Windows操作系统中,全局钩子是一种强大的工具,它允许开发者在系统范围内捕获和处理各种消息。这对于创建诸如自动演示程序、程序日志、辅助调试工具等特殊功能极为有用。此外...
2. **应用程序级钩子**:局部钩子,只对创建它的进程及其子进程有效。 3. **线程级钩子**:针对特定线程的钩子,只会在指定线程中被调用。 二、钩子工作原理 当一个事件发生时,如键盘输入、鼠标点击,Windows会...
钩子函数在Windows编程中是一种强大的机制,它允许开发者插入自定义代码到系统或应用程序的特定事件处理流程中,以实现对特定事件的监控或控制。在中文环境中,理解钩子函数的概念和使用方法对于Windows应用程序开发...
2. **本地系统钩子**:只对创建它的进程及其子进程有效。 3. **线程系统钩子**:针对特定线程的事件进行拦截。 在C#中,实现系统钩子通常涉及以下步骤: 1. 定义一个委托类型,该委托对应于Windows API中的钩子回调...