钩子函数捕捉键盘消息
输入捕获总结

输入捕获总结简介输入捕获是计算机领域中的一项技术,它可以记录和分析用户的输入行为。
输入行为包括键盘输入、鼠标点击、触摸屏操作等。
通过对输入捕获的分析,我们可以更好地了解用户的行为习惯,优化用户体验,提高软件的质量。
输入捕获的原理输入捕获的原理是通过操作系统提供的接口,捕获用户输入的相关信息。
在Windows操作系统中,可以使用钩子(hook)来实现输入捕获。
钩子可以截获特定的Windows消息,例如键盘输入消息(WM_KEYDOWN)、鼠标点击消息(WM_LBUTTONDOWN)等。
当钩子被触发时,可以在回调函数中获取到输入事件的详细信息,例如按下的键盘键码、鼠标点击的坐标等。
输入捕获的应用输入捕获在计算机领域有着广泛的应用。
以下是输入捕获的几个常见应用场景:1. 用户行为分析通过输入捕获,可以收集并分析用户的输入行为,从而了解用户的使用习惯和偏好。
这对于设计产品、优化用户体验非常重要。
例如,在网站的用户行为分析中,可以统计用户的鼠标点击位置和频率,以及键盘输入的内容和速度,从而优化页面布局和交互方式。
2. 安全防护输入捕获可以用于安全防护,例如实现键盘记录器的功能。
键盘记录器可以记录用户在计算机键盘上输入的内容,例如账号密码等敏感信息。
通过输入捕获,可以检测和阻止恶意程序对用户输入信息的获取,提高系统的安全性。
3. 软件调试和性能优化在软件开发过程中,输入捕获对于软件调试和性能优化也非常有帮助。
通过捕获用户的输入行为,可以定位软件中可能存在的bug和性能瓶颈。
例如,在游戏开发中,可以捕获玩家的键盘输入和鼠标点击来优化游戏的响应速度和控制体验。
输入捕获的挑战尽管输入捕获在很多领域都有广泛的应用,但是它也面临一些挑战。
1. 隐私问题由于输入捕获可以记录用户的输入行为,涉及到用户隐私的问题。
当需要使用输入捕获进行用户行为分析时,需要保证用户的个人信息得到合理的保护,遵守相关的法律法规。
2. 兼容性问题不同的操作系统和开发平台提供的输入捕获接口可能存在差异,导致跨平台的兼容性问题。
钩子函数讲解

钩⼦函数讲解钩⼦,⼏乎所有的键盘监控程序都使⽤钩⼦机制来捕获系统的击键信息。
⼤家知道,在DOS操作系统下,如果要截获某种系统功能,可以在编程中采取截获中断的办法,⽐如要获取击键信息,可以使⽤9号中断调⽤,要获取应⽤程序对⽂件操作功能的调⽤可以截获21号中断。
DOS下截获中断的⽅法是这样的随意和⽅便,不论是驱动程序还是应⽤程序都可以操作,这样就给⼀些恶意程序留下了可乘之机,对系统的安全造成了极⼤的隐患。
⽽在Windows 2000下就不同了,Windows 2000采⽤了保护模式,在保护模式下的中断描述符表是受系统保护的,应⽤程序是不可能再通过修改中断向量来截获系统中断了。
这在提供了更⾼安全性的同时,实际上对应⽤程序在调⽤底层功能⽅⾯造成了很⼤的不便。
不过,Windows采取了⼀些变通的⽅法,将⼀些系统的底层调⽤封装在了⾃⼰的API函数中,通过向⽤户提供接⼝使⽤户可以受限的使⽤⼀些系统调⽤。
钩⼦,⼏乎所有的键盘监控程序都使⽤钩⼦机制来捕获系统的击键信息。
⼤家知道,在DOS操作系统下,如果要截获某种系统功能,可以在编程中采取截获中断的办法,⽐如要获取击键信息,可以使⽤9号中断调⽤,要获取应⽤程序对⽂件操作功能的调⽤可以截获21号中断。
DOS下截获中断的⽅法是这样的随意和⽅便,不论是驱动程序还是应⽤程序都可以操作,这样就给⼀些恶意程序留下了可乘之机,对系统的安全造成了极⼤的隐患。
⽽在Windows 2000下就不同了,Windows 2000采⽤了保护模式,在保护模式下的中断描述符表是受系统保护的,应⽤程序是不可能再通过修改中断向量来截获系统中断了。
这在提供了更⾼安全性的同时,实际上对应⽤程序在调⽤底层功能⽅⾯造成了很⼤的不便。
不过,Windows采取了⼀些变通的⽅法,将⼀些系统的底层调⽤封装在了⾃⼰的API函数中,通过向⽤户提供接⼝使⽤户可以受限的使⽤⼀些系统调⽤。
TIPS:钩⼦是Windows的消息处理机制中提供的⼀个监视点,应⽤程序可以在这⾥安装⼀个过滤程序,这样就可以在系统中的消息流到达⽬的程序前监控它们。
DELPHIHOOK函数建立键盘鼠标动作记录与回放

DELPHIHOOK函数建立键盘鼠标动作记录与回放在Delphi中,可以通过使用Hook函数来建立键盘鼠标动作的记录与回放。
Hook函数可以拦截系统消息和事件,并允许我们在消息处理前或处理后执行自定义的代码。
首先,我们需要创建一个DLL来实现Hook函数。
在Delphi中,可以通过创建一个动态链接库项目来实现这一点。
在动态链接库项目中,我们将添加一个Hook函数来拦截键盘和鼠标事件。
在Hook函数中,我们可以使用Windows API来获取键盘和鼠标的状态,以及记录和回放这些动作。
以下是一个简单的示例代码,演示如何创建基本的键盘鼠标动作记录与回放的功能:```delphilibrary MouseKeyboardHook;usesSystem.SysUtils,System.Classes,Winapi.Windows;varFOutputFile: TextFile;function KeyboardHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varkbHookStruct: PKBDLLHOOKSTRUCT;vkCode: Cardinal;beginif code >= 0 thenbeginkbHookStruct := PKBDLLHOOKSTRUCT(lParam);vkCode := kbHookStruct^.vkCode;//将键盘记录写入文件WriteLn(FOutputFile, 'Keyboard: ' + IntToStr(vkCode));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;function MouseHookProc(code: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;varmsHookStruct: PMOUSEHOOKSTRUCT;mouseMsg: Cardinal;pt: TPoint;beginif code >= 0 thenbeginmsHookStruct := PMOUSEHOOKSTRUCT(lParam);mouseMsg := msHookStruct^.mouseData;pt := msHookStruct^.pt;//将鼠标记录写入文件WriteLn(FOutputFile, 'Mouse: ' + IntToStr(mouseMsg) + ' X:' + IntToStr(pt.X) + ' Y:' + IntToStr(pt.Y));end;// 继续传递消息给下一个HookResult := CallNextHookEx(0, code, wParam, lParam);end;procedure StartRecording;beginAssignFile(FOutputFile, 'actions.log');Rewrite(FOutputFile);// 安装键盘Hook// 安装鼠标Hookend;procedure StopRecording;begin// 卸载键盘Hook// 卸载鼠标HookCloseFile(FOutputFile);end;exportsStartRecording,StopRecording;beginend.```在上述代码中,我们创建了两个Hook函数:KeyboardHookProc和MouseHookProc。
DELPHIHOOK函数建立键盘鼠标动作记录与回放

DELPHIHOOK函数建立键盘鼠标动作记录与回放1.键盘记录与回放:DELPHIHOOK函数可以捕获用户在键盘上的按键操作,并将这些操作记录下来,然后可以进行回放,模拟用户的按键过程。
这个功能在程序调试和测试中非常有用,可以帮助开发人员快速定位问题所在。
2.鼠标动作记录与回放:除了键盘操作,DELPHIHOOK函数还可以记录用户在鼠标上的操作,比如点击、移动等动作。
这样,在程序调试和测试中,可以直观地看到用户是如何操作鼠标的,从而更好地理解用户行为和需求。
3.自定义快捷键设定:DELPHIHOOK函数还支持自定义快捷键的设定,用户可以根据自己的需求设置一些快捷键,方便程序操作和调试。
DELPHIHOOK函数的实现原理是通过Windows的Hook技术来实现的,Hook是一种在Windows系统中用于拦截和修改系统消息和事件的机制。
DELPHIHOOK函数通过加载一个DLL动态链接库,并在其中设置一些Hook函数,来拦截并记录用户的键盘和鼠标操作。
下面我们来看一下DELPHIHOOK函数的具体实现步骤:1. 创建一个DLL项目:首先,在Delphi中创建一个DLL项目,命名为HookDLL。
2. 实现键盘Hook函数:在HookDLL中实现一个键盘Hook函数,用于捕获用户在键盘上的按键操作。
可以使用Windows API中的SetWindowsHookEx函数来实现。
3. 实现鼠标Hook函数:同样,在HookDLL中实现一个鼠标Hook函数,用于捕获用户在鼠标上的操作。
可以使用Windows API中的SetWindowsHookEx函数来实现。
4. 记录用户操作:在HookDLL中实现一个记录用户操作的函数,将捕获到的键盘和鼠标操作记录下来,保存到一个文件或内存中。
5. 回放用户操作:在HookDLL中实现一个回放用户操作的函数,用来读取之前记录的操作,然后模拟用户的操作过程。
6. 在主程序中调用HookDLL:最后,在Delphi主程序中调用HookDLL中的函数,来实现键盘和鼠标动作的记录和回放功能。
C#钩子屏蔽键盘鼠标

//屏蔽键盘using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.IO;using System.Reflection;namespace KeyboardDLL{public class KeyboardHook{public delegate int KeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);static int hKeyboardHook = 0;KeyboardProc KeyboardHookProcedure;///<summary>///钩子函数,需要引用空间(using System.Reflection;)///线程钩子监听键盘消息设为2,全局钩子监听键盘消息设为13///线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14///</summary>public const int WH_KEYBOARD = 13;public const int WH_MOUSE_LL = 14;public struct KeyboardMSG{public int vkCode;public int scanCode;public int flags;public int time;public int dwExtraInfo;public int VK_CONTROL;public int VK_MENU;public int VK_DELETE;}///<summary>/// kernel32.dll是Windows 95,Windows 98和Windows Me中使用的32位动态链接库文件。
///kernel32.dll是负责内存管理、输入输出以及中断等工作。
消息钩子函数入门篇

消息钩子函数入门篇【摘要】消息钩子函数是一种常见的编程技术,用于在特定事件发生时触发自定义功能。
本文将介绍消息钩子函数的基本概念,包括其定义、作用和使用方法。
我们将通过实例演示消息钩子函数的具体应用,并解释与之相关的一些重要概念。
在结尾部分,我们将对本文内容进行总结,展望未来消息钩子函数的发展,以及提出一些建议。
希望通过本文的介绍,读者能够对消息钩子函数有一个更深入的理解,并在实际项目中灵活应用。
【关键词】消息钩子函数、入门、介绍、目的、背景、作用、使用、实例、相关概念、总结、展望、结束语1. 引言1.1 消息钩子函数入门篇- 介绍消息钩子函数是一种在软件开发中非常常见的概念,它可以让我们在特定的事件发生时执行自定义的逻辑。
在程序执行的过程中,系统会触发一些特定的事件,比如用户点击按钮、发送请求等,这时就可以通过消息钩子函数来捕获这些事件并进行相应的处理。
消息钩子函数的概念在不同的编程语言和框架中有着不同的实现方式,但其核心思想是相通的。
通过消息钩子函数,开发者可以在程序的不同阶段插入自定义的逻辑,这样可以更灵活地控制程序的行为。
在本篇文章中,我们将深入介绍消息钩子函数的概念和应用,帮助读者更好地理解和应用这一重要的技术。
从消息钩子函数的基本概念、作用和使用方法,到实际的应用案例和相关概念的解释,我们将全方位地探讨消息钩子函数的入门知识,希望能够帮助读者更好地利用这一功能提升自己的编程技能。
的内容将在接下来的文章中一一展开,让我们一起来深入学习吧!1.2 消息钩子函数入门篇- 目的消息钩子函数入门篇是一种非常有用的编程技术,它可以让开发人员在特定的事件发生时执行特定的功能。
在编程中,我们经常需要在某些事件发生时执行一些额外的操作,比如在用户点击按钮时验证表单数据,在用户登录时发送通知等。
而消息钩子函数就是为了实现这种需求而设计的。
这篇文章的目的是帮助读者了解什么是消息钩子函数,以及它们的作用和使用方法。
C#dll之键盘钩子详解

C#dll之键盘钩子详解WINDOWS键盘事件的挂钩监控原理及其应用技术WINDOW的消息处理机制为了能在应用程序中监控系统的各种事件消息,提供了挂接各种反调函数(HOOK)的功能。
这种挂钩函数(HOOK)类似扩充中断驱动程序,挂钩上可以挂接多个反调函数构成一个挂接函数链。
系统产生的各种消息首先被送到各种挂接函数,挂接函数根据各自的功能对消息进行监视、修改和控制等,然后交还控制权或将消息传递给下一个挂接函数以致最终达到窗口函数。
WINDOW系统的这种反调函数挂接方法虽然会略加影响到系统的运行效率,但在很多场合下是非常有用的,通过合理有效地利用键盘事件的挂钩函数监控机制可以达到预想不到的良好效果。
一、在WINDOWS键盘事件上挂接监控函数的方法WINDOW下可进行挂接的过滤函数包括11种:WH_CALLWNDPROC 窗口函数的过滤函数WH_CBT 计算机培训过滤函数WH_DEBUG 调试过滤函数WH_GETMESSAGE 获取消息过滤函数WH_HARDWARE 硬件消息过滤函数WH_JOURNALPLAYBACK 消息重放过滤函数WH_JOURNALRECORD 消息记录过滤函数WH_MOUSE 鼠标过滤函数WH_MSGFILTER 消息过滤函数WH_SYSMSGFILTER 系统消息过滤函数WH_KEYBOARD 键盘过滤函数其中键盘过滤函数是最常用最有用的过滤函数类型,不管是哪一种类型的过滤函数,其挂接的基本方法都是相同的。
WINDOW调用挂接的反调函数时总是先调用挂接链首的那个函数,因此必须将键盘挂钩函数利用函数SetWindowsHookEx()将其挂接在函数链首。
至于消息是否传递给函数链的下一个函数是由每个具体函数功能确定的,如果消息需要传统给下一个函数,可调用API函数的CallNextHookEx()来实现,如果不传递直接返回即可。
挂接函数可以是用来监控所有线程消息的全局性函数,也可以是单独监控某一线程的局部性函数。
DELPHIHOOK函数建立键盘鼠标动作记录与回放

DELPHIHOOK函数建立键盘鼠标动作记录与回放Delphi是一种非常强大的编程语言和集成开发环境。
使用Delphi,我们可以开发各种类型的应用程序,包括桌面应用程序、移动应用程序和网页应用程序等。
本文将介绍如何使用Delphi编写钩子函数来记录和回放键盘和鼠标动作。
钩子函数是一种特殊的函数,可以捕获和处理操作系统中发生的事件。
在Delphi中,可以使用Windows API函数来设置钩子函数。
下面是一些常用的钩子函数:1. SetWindowsHookEx函数:用于设置全局钩子函数。
可以使用该函数来捕获系统中发生的各种事件,包括键盘事件和鼠标事件等。
2. CallNextHookEx函数:用于将事件传递给下一个钩子函数或默认处理程序。
在钩子函数中,应该调用该函数来确保事件被正确处理。
3. UnhookWindowsHookEx函数:用于删除之前设置的钩子函数。
首先,我们需要创建一个新的Delphi工程并添加一个窗体。
在窗体上放置两个按钮,一个用于开始记录,另一个用于停止记录。
我们还需要添加一些全局变量来保存记录的动作。
```delphiunit Main;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;typeTForm1 = class(TForm)Button1: TButton;Button2: TButton;procedure Button1Click(Sender: TObject);procedure Button2Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;IsRecording: Boolean;Actions: TList;implementation{$R *.dfm}procedure RecordMouseAction(var Msg: TMessage); stdcall; beginif IsRecording thenbegin//记录鼠标动作case Msg.Msg ofWM_LBUTTONDOWN:Actions.Add(Pointer('MouseLeftButtonDown'));WM_LBUTTONUP:Actions.Add(Pointer('MouseLeftButtonUp'));WM_RBUTTONDOWN:Actions.Add(Pointer('MouseRightButtonDown'));WM_RBUTTONUP:Actions.Add(Pointer('MouseRightButtonUp'));//添加更多的鼠标动作记录end;end;CallNextHookEx(0, Msg.Msg, Msg.WParam, Msg.LParam);end;procedure RecordKeyboardAction(var Msg: TMessage); stdcall; beginif IsRecording thenbegin//记录键盘动作case Msg.Msg ofWM_KEYDOWN:Actions.Add(Pointer('KeyDown:' + IntToStr(Msg.WParam))); WM_KEYUP:Actions.Add(Pointer('KeyUp:' + IntToStr(Msg.WParam)));//添加更多的键盘动作记录end;end;CallNextHookEx(0, Msg.Msg, Msg.WParam, Msg.LParam);end;procedure TForm1.Button1Click(Sender: TObject);begin//开始记录Actions := TList.Create;//设置鼠标钩子//设置键盘钩子IsRecording := True;end;procedure TForm1.Button2Click(Sender: TObject); vari: Integer;begin//停止记录IsRecording := False;//卸载钩子UnhookWindowsHookEx(HookMouse); UnhookWindowsHookEx(HookKeyboard);//回放记录的动作for i := 0 to Actions.Count - 1 dobeginif StrPos(PChar(Actions[i]), 'Mouse') <> nil then beginif StrPos(PChar(Actions[i]), 'ButtonDown') <> nil then begin//执行鼠标按下动作endelse if StrPos(PChar(Actions[i]), 'ButtonUp') <> nil then begin//执行鼠标松开动作end;endelse if StrPos(PChar(Actions[i]), 'Key') <> nil then beginif StrPos(PChar(Actions[i]), 'Down') <> nil thenbegin//执行键盘按下动作endelse if StrPos(PChar(Actions[i]), 'Up') <> nil thenbegin//执行键盘松开动作end;end;end;Actions.Free;end;end.```在上面的代码中,我们使用记录和回放动作的两个按钮的单击事件来控制开始/停止记录和回放动作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用钩子函数来捕捉键盘响应的windows应用程序一:引言:你也许一直对金山词霸的屏幕抓词的实现原理感到困惑,你也许希望将你的键盘,鼠标的活动适时的记录下来,甚至你想知道木马在windows操作系统是怎样进行木马dll的加载的…..其实这些都是用到了windows的钩子函数。
因此本文将对钩子函数的相关知识进行阐述。
当然,本文的目的并不是想通过此程序让读者去窃取别人的密码,只是由于钩子函数在windows系统中是一个非常重要的系统接口函数,所以想和大家共同的探讨,当然本文也对怎样建立动态连结库(DLL)作了一些简单的描述。
(本文的程序为vc6.0的开发环境,语言是:C和win32 api)。
二:钩子概述:微软的windowsX操作系统是建立在事件驱动的机制上的,也就是通过消息传递来实现。
而钩子在windows操作系统中,是一种能在事件(比如:消息、鼠标激活、键盘响应)到达应用程序前中途接获事件的机制。
而且,钩子函数还可以通过修改、丢弃等手段来对事件起作用。
Windows 有两种钩子,一种是特定线程钩子(Thread specific hooks),一种是全局系统钩子(Systemwide hooks)。
特定线程钩子只是监视指定的线程,而全局系统钩子则可以监视系统中所有的线程。
无论是特定线程钩子,还是全局系统钩子,都是通过SetWindowsHookEx ()来设置钩子的。
对于特定线程钩子,钩子的函数既可以是包含在一个.exe也可以是一个.dll。
但是对于一个全局系统钩子,钩子函数必须包含在独立的dll中,因此,当我们要捕捉键盘响应时,我们必须创建一个动态链接库。
但是当钩子函数在得到了控制权,并对相关的事件处理完后,如果想要该消息得以继续的传递,那么则必须调用另一个函数:CallNextHookEx。
由于系统必须对每个消息处理,钩子程序因此增加了处理的负担,因此也降低了系统的性能。
鉴于这一点,在windows ce中对钩子程序并不支持。
所以当程序完成并退出时,应当释放钩子,调用函数:UnhookWindowsHookEx。
下面我们将举一个例子(捕捉键盘)来详细的讲解钩子函数的程序设计。
三:程序的设计:I:设置钩子设置钩子是通过SetWindowsHookEx ()的API函数.原形: HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId)idhook:装入钩子的类型.lpfn: 钩子进程的入口地址hMod: 应用程序的事件句柄dwThreadId: 装入钩子的线程标示参数:idHook:这个参数可以是以下值: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。
对于这些参数,我不想一一加以解释,因为MSDN中有关于他们的详细注解。
我只挑选其中的几个加以中文说明。
WH_KEYBOARD:一旦有键盘敲打消息(键盘的按下、键盘的弹起),在这个消息被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。
钩子函数可以改变和丢弃键盘敲打消息。
WH_MOUSE:每个鼠标消息在被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。
钩子函数可以改变和丢弃鼠标消息。
WH_GETMESSAGE:每次当你的应用程序调用一个GetMessage()或者一个PeekMessage()为了去从应用程序的消息队列中要求一个消息时,WINDOWS都会调用你的钩子函数。
而钩子函数可以改变和丢弃这个消息。
II:释放钩子钩子的释放使用的是UnhookWindowsHookEx()函数原形:BOOL UnhookWindowsHookEx( HHOOK hhk )UnhookWindowsHookEx()函数将释放的是钩子链中函数SetWindowsHookEx所装入的钩子进程。
hhk: 将要释放的钩子进程的句柄。
III:钩子进程钩子进程使用函数HookProc;其实HookProc仅仅只是应用程序定义的符号。
比如你可以写成KeyBoardHook.但是参数是不变的。
Win32 API提供了诸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc 等函数,对于他们的详细讲解,可以看MSDN我在此只讲解一下KeyBoardHook的含义。
原形:LRESULT CALLBACK KeyBoardHook (int nCode, WPARAM wParam, LPARAM lParam)说明:钩子进程是一些依附在一个钩子上的一些函数,因此钩子进程只被WINDOWS调用而不被应用程序调用,他们有时就需要作为一个回调函数(CALLBACK)。
参数说明:nCode:钩子代码,钩子进程使用钩子代码去决定是否执行。
而钩子代码的值是依靠钩子的种类来定的。
每种钩子种类都有他们自己一系列特性的代码。
比如对于WH_KEYBOARD,钩子代码的参数有:HC_ACTION,HC_NOREMOVE。
HC_ACTION的意义:参数wParam 和lParam 包含了键盘敲打消息的信息,HC_NOREMOVE的意义:参数wParam 和lParam包含了键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。
(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。
也就是说当nCode等于HC_ACTION时,钩子进程必须处理消息。
而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。
wParam:键盘敲打所产生的键盘消息,键盘按键的虚拟代码。
lParam:包含了消息细节。
注意:如果钩子进程中nCode小于零,钩子进程必须返回(return) CallNextHookEx(nCode,wParam,lParam);而钩子进程中的nCode大于零,但是钩子进程并不处理消息,作者推荐你调用CallNextHookEx并且返回该函数的返回值。
否则,如果另一个应用程序也装入WH_KEYBOARD 钩子,那么该钩子将不接受钩子通知并且返回一个不正确的值。
如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程。
所以最好在钩子进程的最后都返回CallNextHookEx的返回值。
IV:调用下一个钩子函数调用下一个钩子函数时使用CallNexHookEx函数。
原形:LRESULT CallNextHookEx( HHOOK hhk, int nCode, WPARAM wParam, LPARAM lParam )CallNexHookEx()函数用于对当前钩子链中的下一个钩子进程传递钩子信息,一个钩子进程既可以在钩子信息处理前,也可以在钩子信息处理后调用该函数。
为什么使用该函数已在iii钩子进程中的“注意”中,加以了详细的说明。
hhk: 当前钩子的句柄nCode: 传送到钩子进程的钩子代码。
wParam:传送到钩子进程的值。
lParam:传送到钩子进程的值。
参数:hhk: 当前钩子的句柄. 应用程序接受这个句柄,作为先前调用SetWindowsHookE函数的结果nCode: 传送到钩子进程的钩子代码,下一个钩子进程使用这个代码以此决定如何处理钩子信息wParam:传送给钩子进程的wParam 参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关lParam : 传送给钩子进程的wParam 参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关返回值:返回值是链中下一个钩子进程返回的值,当前钩子进程必须返回这个值,返回值的具体含义与挂接的钩子类型有关,详细信息请参看具体的钩子进程描述。
V 建立一个动态连接库(DLL)当我们熟悉了以上的各个函数后,现在我们开始编写一个动态连接库(DLL)。
在这儿我采用的是WIN32 DLL,而不是MFC DLL。
而且以下所有的程序也都是采用C语言去编写。
这主要是因为使用WIN32 API能够更详细、更全面的控制程序的如何执行,而使用MFC,一些低级的控制是不可能实现的(当然,仅对该程序来说,也是可以使用MFC的)。
1:建立一个动态连接库的.cpp文件。
比如我们现在建立一个名为hookdll.cpp的文件。
在hookdll.cpp的文件中加上如下内容:#include <windows.h>#include "string.h"#include "stdio.h"HINSTANCE hInst;#pragma data_seg("hookdata")HHOOK oldkeyhook=0;#pragma data_seg()#pragma comment(linker,"/SECTION:hookdata,RWS")#define DllExport extern "C"__declspec(dllexport)DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam );DllExport void InstallHook(int nCode);DllExport void EndHook(void);BOOL WINAPI DllMain(HINSTANCE hInstance,ULONG What,LPVOID NotUsed){switch(What){case DLL_PROCESS_ATTACH:hInst = hInstance;break;case DLL_PROCESS_DETACH:break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;}return 1;}void InstallHook(int nCode){oldkeyhook = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,0);}DllExport LRESULT CALLBACK KeyBoardProc(int nCode,WPARAM wParam, LPARAM lParam ){WPARAM j;FILE *fp;if(lParam&0x80000000){j = wParam;fp=fopen("c:\hook\key.txt","a");fprintf(fp,"%4d",j);fclose(fp);}return CallNextHookEx(oldkeyhook,nCode,wParam,lParam);}void EndHook(void){UnhookWindowsHookEx(oldkeyhook);}这个动态连接库的源代码hookdll.cpp包含了键盘处理函数,设置钩子,退出钩子函数。