`
javasogo
  • 浏览: 1845305 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

钩子及其应用(二)

阅读更多

{二}宏功能的实现

我们写程序,常将完成一个特定功能的代码写到一个函数中,以后直接调用便可实现该功能。对于宏,其实也是相同的原理,将一些键盘和鼠标的操作“录制”起来,以后如果要重复这些操作,只需要将这些操作“回放”就行了。许多编辑软件都有宏的功能,比如WordDelphi也有,按Ctrl+Shift+R进行宏录制,再按Ctrl+Shift+R结束,最后按Ctrl+Shift+P即可回放刚才的输入操作。宏的实现正是钩子的一个应用,使用WH_JOURNALRECORDWH_JOURNALPLAYBACK钩子可以完成对于键盘来鼠标动作的“录制”和“回放”,基于此技术,我们就来实现一个自己的宏。

大多数软件的宏只是记录键盘的操作,并没有鼠标的操作,但有时候记录鼠标的操作也是有好处的,比如你正在测试一个程序,需要重复地进行点击移动,这时鼠标的宏就派上用场了。前一阵子一个朋友用VC实现了一个UI自动测试工具,非常有趣,这次我也依照它用Delphi来实现一个,它可以记录所有的鼠标键盘操作,并回放出来,还可以保存这些操作。

先说日志钩子,日志钩子不需要动态链接库*.DLL,就能实现系统级的事件监控,它只能监视两种事件,即鼠标,键盘的操作。我们用前一节所说的APISetWindowsHookEx安装一个日志钩子,这里要重点说明日志钩子的过滤函数:

LRESULT CALLBACK JournalRecordProc(

int code, // 钩子编码

WPARAM wParam, // 没有使用

LPARAM lParam // 被处理的消息

);

其中Code说明如何处理消息,可以是如下的值:

HC_ACTIONlParam是指向一个EVENTMSG结构的指针,该结构包含了从系统队列中移除的消息的信息。

HC_SYSMODALOFF :一个系统模态对话框(如注销对话框)已经被销毁的时候,该钩子过程重新开始记录。

HC_SYSMODALON:一个系统模态对话框正在被销毁,直到它被销毁之前,钩子过程停止记录。

如果Code参数小于0,则要像第一部分所说的调用CallNextHookEx函数,并返回它的返回值。

lParam参数是指向一个EVENTMSG结构的指针。这个结构就是我们要记录的信息。

EVENTMSG如下声明:

typedef struct tagEVENTMSG {

UINT message; //指定消息

UINT paramL; //指定消息的附加信息,该信息取决于消息的值

UINT paramH; //指定消息的附加信息,该信息取决于消息的值

DWORD time; //消息传递的时间

HWND hwnd; //消息将传递到的窗口的句柄。

} EVENTMSG, *PEVENTMSG;

在这里给出paramLparamH对鼠标和键盘的意义:

ParamL:如果是键盘消息则代表虚拟码,如果是鼠标消息则代表坐标X

ParamH:如果是键盘消息则代表击键的扫描码,如果是鼠标消息则代表坐标Y

我们还要有一个数据结构来保存传递到日志过程中的事件结构列表,以便在回放钩子中使用。Delphi为我们提供了TList,非常方便,List的每一项存储一个EVENTMSG结构指针。不过TList并不管理事件结构指针的生命周期,为方便计,我们可以继续一个子类,并覆盖它的相应方法,即可实现指针的自动释放。

最后还要能将消息序列化,保存到文件中,以后可以重新加载到TList中使用。这里就称为保存和打开的功能。XML是一个不错的选择,可以用XML来保存事件结构(关于XML的使用,请查看其他资料)。

日志记录钩子的技术准备就这些,下面是日志回放钩子的一些知识。

下面是回放钩子的过滤函数:

LRESULT CALLBACK JournalPlaybackProc(

int code, // 钩子编码

WPARAM wParam, // 没有使用

LPARAM lParam // 被处理的消息

);

当回放钩子安装之后,常规的鼠标和键盘输入就无效了。注意这里的常规是指还有一些不常规的按键有效,比如Ctrl+Alt+Del

Code指定了钩子过程如何处理消息,它可以是如下的值:

HC_GETNEXT:如果准备好了(这里的准备好与否由HC_SKIP决定),则将当前鼠标和键盘消息拷贝到LParam参数中,对于我们的程序,就是将事件结构列表中的一个事件结构拷贝给Lparam

HC_SKIP:钩子过程必须准备将下一个鼠标和键盘拷贝到Lparam参数指向的EventMsg结构中。当为这个值时,表示已经准备好了,我们可以设一个全局变量,在这里标识为真,则在HC_GETEXT时,判断该全局变量 ,如果为真,则将事件拷贝给LParam

HC_SYSMODALOFFHC_SYSMODALON:和记录钩子相似。

回放钩子过程的返回值也必须注意,当Code值为HC_GETNEXT时,它指定系统处理当前消息之前要等多少时间,这个时间以毫秒为单位。我们可以通过当前事件结构中的时间与前一个事件结构的时间计算出这个时间值。如果Code是其他值,返回值忽略。

这里补充一点知识, Windows有一个MSG结构,其中有一个成员是Time,表示消息发送的时间,这个时间其实是个相对的值,它从操作系统启动时开始以毫秒为单位增加。调用GetTickCount可以获得该值。

有一种情况,就是当我们按下Alt+Ctrl+Del时,钩子会停止下来的,这个时候有什么消息来通知程序,让我们可以做一些设置工作呢,幸好系统为我们准备了WM_CANCELJOURNAL消息,记录和回放钩子在工作时,当按下那些键,系统发送该消息给应用程序的消息循环,通知钩子停止了。我们可以取得ApplicationOnMessage事件,在其中判断,如果获得了该消息,则作一些变量的设置操作。

好了,还是以代码来说明吧。

是否给出全部源代码,我考虑了一下,如果代码过长,则怕有臭婆娘的缠脚布之嫌。但如果不全部给出,则又怕理解不全。最后还是狠一下心,把全部代码贴出来,都封在wdMacro单元中,读者可以直接拷贝到工程中,再调用其中的API即可:

分享到:
评论

相关推荐

    钩子源码钩子源码

    以下是对钩子机制及其应用的详细解释: 一、钩子的基本概念: 钩子是Windows操作系统提供的一种机制,允许开发者注册函数来接收并处理特定的消息或事件。当特定的事件发生时,如键盘输入、窗口消息、系统事件等,...

    键盘钩子hook键盘钩子

    本地钩子仅在安装它的进程上下文中运行,只能捕获该进程及其子进程中的键盘事件。而全局钩子则更为强大,可以在整个系统范围内工作,监听所有进程中发生的键盘事件。 实现键盘钩子通常涉及以下步骤: 1. 定义钩子...

    Hook钩子\钩子程序.pdf

    下面将详细介绍几种常用的钩子类型及其应用场景: ##### 1. 键盘钩子与低级键盘钩子 **键盘钩子**(Keyboard Hook)用于监控所有键盘消息,包括按键按下与释放等事件。通过这种钩子,开发者可以实现对用户键盘输入...

    键盘钩子、鼠标钩子应用组件示例及 源码

    在IT领域,尤其是在Windows应用程序开发中,"键盘钩子"和"鼠标钩子"是用于监控和处理系统级输入事件的重要技术。这些技术通常涉及到低级别编程,特别是使用C#语言时,EventHook库提供了方便的接口来实现这一功能。本...

    hook_钩子程序-delphi

    总结起来,"hook_钩子程序-delphi"的主题涵盖了一个广泛的Delphi编程领域,涉及到Windows系统中的Hook技术及其在Delphi中的实现,这对于任何希望增强其应用程序功能或进行系统监控的开发者来说都是极其宝贵的资源。...

    完整版键盘钩子.rar

    在这个“完整版键盘钩子.rar”压缩包中,我们将会深入探讨键盘钩子的核心原理、实现方式及其在实际应用中的具体运用。 键盘钩子,简单来说,是一种操作系统级别的机制,允许程序拦截并处理键盘输入事件。这一技术...

    古老的钩子艺术-详细讲解钩子的教程

    本文重点介绍用户空间钩子的技术细节及其应用场景。 #### 三、用户空间钩子(User Space Hook) 用户空间钩子是在用户态下实现的一种Hook技术,主要用于拦截和修改应用程序的行为。这种技术通常不涉及对操作系统核心...

    VC++钩子函数

    ### 钩子函数在VC++中的应用 #### 一、引言 在软件开发过程中,特别是对于Windows应用程序而言,钩子(Hook)技术是一种非常有用的工具,...希望本文能够帮助初学者更好地理解和掌握钩子函数的基本原理及其应用场景。

    简单的钩子函数

    这种实践可以帮助理解钩子的工作原理及其在实际项目中的应用。 在文件"钩子函数"中,可能包含了创建和使用钩子函数的代码示例。通过阅读和分析这些代码,你可以更深入地了解如何在实际编程中设置和管理钩子,以及...

    一个 钩子程序DLL和用来调用的控制台

    【标题】:深入理解钩子程序DLL及其在控制台中的应用 在Windows操作系统中,钩子(Hook)是一种系统机制,允许程序员监控特定事件的发生,例如键盘输入、鼠标操作等。钩子程序通常是一个动态链接库(DLL),它包含...

    钩子资料整理,个人感觉不错

    2. **应用程序级钩子**:局部钩子,只对创建它的进程及其子进程有效。 3. **线程级钩子**:针对特定线程的钩子,只会在指定线程中被调用。 二、钩子工作原理 当一个事件发生时,如键盘输入、鼠标点击,Windows会...

    用VC_c全局钩子.pdf

    #### 一、全局钩子的概念及其重要性 在Windows操作系统中,全局钩子是一种强大的工具,它允许开发者在系统范围内捕获和处理各种消息。这对于创建诸如自动演示程序、程序日志、辅助调试工具等特殊功能极为有用。此外...

    消息钩子代码实现

    本篇文章将深入探讨消息钩子的实现及其在拦截`WM_COMMAND`消息中的应用。 首先,我们需要理解什么是`WM_COMMAND`消息。`WM_COMMAND`是Windows消息的一种,它在用户与菜单、快捷键、控件交互时产生,传递控制ID和...

    全局键盘钩子获取扫描枪输入

    全局键盘钩子是Windows操作系统提供的一种机制,允许应用程序在系统层面捕获键盘事件,即使焦点不在该应用程序上。这种技术通常用于实现系统级...通过分析和学习这段代码,可以加深对全局键盘钩子及其实现细节的理解。

    系统钩子示例程序.rar

    全局钩子在所有当前运行于同一台计算机上的线程间共享,而本地钩子只对创建它的进程及其子进程有效。此外,还有WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD_LL、WH_MOUSE_LL等不同类型的钩子,它们分别针对...

    MFC --进程中的钩子

    本文将详细探讨MFC中的进程钩子及其使用方法。 首先,让我们理解什么是进程钩子。进程钩子是安装在特定进程中的,当该进程中发生特定事件时,钩子函数会被调用。这使得开发者可以在事件发生时进行干预,实现自定义...

    详解Vue3生命周期及其 Composition API 钩子应用与对比

    内容概要:本文介绍了 Vue3 的生命周期各个阶段以及各周期钩子的功能与调用时机,并详细讲解了这些生命周期的变化情况及与Vue2的区别,特别是对新增Composition API形式的生命周期做了细致解析和示例代码说明。...

    钩子函数中文版,翻译的很详细

    钩子函数在Windows编程中是一种强大的机制,它允许开发者插入自定义代码到系统或应用程序的特定事件处理流程中,以实现对特定事件的监控或控制。在中文环境中,理解钩子函数的概念和使用方法对于Windows应用程序开发...

    鼠标键盘钩子截获密码的代码

    ### 鼠标键盘钩子技术详解及其应用 #### 一、钩子技术概述 钩子(Hook)技术是Windows操作系统提供的一种高级编程接口,它允许开发者捕获、拦截或修改系统中的各种消息和事件。通过钩子技术,开发者可以实现一些...

    C++键盘钩子

    以下是几种常见的钩子类型及其作用: 1. **WH_CALLWNDPROC** 和 **WH_CALLWNDPROCRET Hooks**:这两个钩子允许你监控发送到窗口过程的消息。WH_CALLWNDPROC在消息被发送到接收窗口之前调用,WH_CALLWNDPROCRET则在...

Global site tag (gtag.js) - Google Analytics