利用键盘钩子捕获Windows键盘动作

合集下载

输入捕获总结

输入捕获总结

输入捕获总结简介输入捕获是计算机领域中的一项技术,它可以记录和分析用户的输入行为。

输入行为包括键盘输入、鼠标点击、触摸屏操作等。

通过对输入捕获的分析,我们可以更好地了解用户的行为习惯,优化用户体验,提高软件的质量。

输入捕获的原理输入捕获的原理是通过操作系统提供的接口,捕获用户输入的相关信息。

在Windows操作系统中,可以使用钩子(hook)来实现输入捕获。

钩子可以截获特定的Windows消息,例如键盘输入消息(WM_KEYDOWN)、鼠标点击消息(WM_LBUTTONDOWN)等。

当钩子被触发时,可以在回调函数中获取到输入事件的详细信息,例如按下的键盘键码、鼠标点击的坐标等。

输入捕获的应用输入捕获在计算机领域有着广泛的应用。

以下是输入捕获的几个常见应用场景:1. 用户行为分析通过输入捕获,可以收集并分析用户的输入行为,从而了解用户的使用习惯和偏好。

这对于设计产品、优化用户体验非常重要。

例如,在网站的用户行为分析中,可以统计用户的鼠标点击位置和频率,以及键盘输入的内容和速度,从而优化页面布局和交互方式。

2. 安全防护输入捕获可以用于安全防护,例如实现键盘记录器的功能。

键盘记录器可以记录用户在计算机键盘上输入的内容,例如账号密码等敏感信息。

通过输入捕获,可以检测和阻止恶意程序对用户输入信息的获取,提高系统的安全性。

3. 软件调试和性能优化在软件开发过程中,输入捕获对于软件调试和性能优化也非常有帮助。

通过捕获用户的输入行为,可以定位软件中可能存在的bug和性能瓶颈。

例如,在游戏开发中,可以捕获玩家的键盘输入和鼠标点击来优化游戏的响应速度和控制体验。

输入捕获的挑战尽管输入捕获在很多领域都有广泛的应用,但是它也面临一些挑战。

1. 隐私问题由于输入捕获可以记录用户的输入行为,涉及到用户隐私的问题。

当需要使用输入捕获进行用户行为分析时,需要保证用户的个人信息得到合理的保护,遵守相关的法律法规。

2. 兼容性问题不同的操作系统和开发平台提供的输入捕获接口可能存在差异,导致跨平台的兼容性问题。

监测键盘状态的方法

监测键盘状态的方法

监测键盘状态的方法下面将介绍几种常见的监测键盘状态的方法:1.轮询模式检测键盘状态:在轮询模式下,应用程序会在一个循环中不断地检测键盘状态。

该循环可以由操作系统提供的API函数实现,也可以由程序员编写自定义的循环来检测键盘状态。

轮询模式是最简单、最常见的键盘监测方法。

其基本流程如下:(1)初始化键盘状态变量。

(2)进入循环。

(3)检测键盘状态。

(4)根据键盘状态来执行相应的操作。

(5)返回第三步。

2.事件驱动模式检测键盘状态:在事件驱动模式下,应用程序会注册一个键盘事件监听器,当有键盘事件发生时,操作系统会通知应用程序,应用程序再根据具体的事件类型做出相应的处理。

其基本步骤如下:(1)注册键盘事件监听器。

(2)进入事件循环。

(3)等待键盘事件发生。

(4)根据事件类型执行相应的操作。

(5)返回第三步。

3.钩子模式检测键盘状态:钩子模式是一种更底层、更复杂的键盘监测方法,它可以在操作系统级别进行键盘状态的监测,因此比轮询模式和事件驱动模式更灵活和强大。

其基本步骤如下:(1)安装键盘钩子。

(2)等待钩子回调函数被触发。

(3)根据钩子回调函数中传递的参数,获取键盘状态。

(4)根据键盘状态执行相应的操作。

(5)返回第二步。

需要注意的是,钩子模式的使用需要一定的权限,因为它可以在操作系统级别进行键盘状态的监测,如果被恶意程序滥用,可能会对系统稳定性和安全性造成威胁。

除了上述三种常见的监测键盘状态的方法,还可以使用操作系统提供的键盘状态查询API函数,例如Windows平台下的GetKeyState函数和GetAsyncKeyState函数,它们可以获取当前按键的状态。

总结起来,监测键盘状态有轮询模式、事件驱动模式和钩子模式等几种常见的方法。

选择哪种方法取决于具体的应用场景和需求。

在实际应用中,可以根据具体情况进行选择和结合使用,以满足对键盘状态监测的要求。

计算机犯罪研究系列(二十五)利用脚本外挂程序模拟人工操作鼠标键盘自动打怪类行为刑事责任分析

计算机犯罪研究系列(二十五)利用脚本外挂程序模拟人工操作鼠标键盘自动打怪类行为刑事责任分析

计算机犯罪研究系列(二十五)利用脚本外挂程序模拟人工操作鼠标键盘自动打怪类行为刑事责任分析作者:车冲律师计算机犯罪研究系列(二十五)利用脚本外挂程序模拟人工操作鼠标键盘自动打怪类行为刑事责任分析在网络游戏世界,流行各种脚本、按键精灵、辅助等外挂程序。

很多外挂的作者和使用者认为只要自己开发或使用的是模拟人手指操作的或者不修改游戏服务器、客户端等环节中形成和保存的数据就不会承担刑事责任。

诚然,上面的观点已经一定程度上认识到了刑法中对于脚本等外挂的打击方向之一,但是该类观点忽略了除了“修改”计算机信息系统中的“数据”之外,还有“控制”“侵入”“破坏”等计算机信息系统的打击方向。

事实上,脚本外挂程序无论是修改计算机信息系统数据、控制计算机信息系统、侵入/破坏计算机信息系统都可以构成《刑法》第二百八十五条和二百八十六条的相关犯罪。

脚本等外挂程序能够模拟人工操作实现游戏人物的自动打怪、自动行走、自动拾取、自动回城等行为,主要是通过非修改数据或修改数据的方式实现。

这意味着本来应该由人工操作下达的指令需要在程序层面来“模拟”以实现相同的效果。

“模拟”的实现过程就是本文分析的主要内容。

控制类型的脚本外挂在控制类型之下,体现为通过各种方式对计算机信息信息系统的控制来实现向计算机信息系统“传输”信息,使得计算机信息系统错误的认定传输的操作指令为人工操作。

以一控制类脚本外挂为例子,通过在游戏客户端进程中注入全局键盘钩子的方式,得以监控系统内所有键盘操作,然后在后续的程序调用函数载入动态链接库文件时,让自己编写的函数的执行具有优先性,并实际优先执行,下一步通过正常加载的方式,使得客户端向服务器传送的操作指令中包含了作者发出的指令(类似于通过键盘和鼠标的操作发出的指令),达到模拟键盘、鼠标的人工操作的目的。

这类脚本外挂的“控制”主要是通过注入的程序的优先执行得以实现的。

无论是从计算机信息系统本身,还是在游戏服务器的角度,都能看出脚本外挂程序的“优先性”,而之所以能够达到“优先”执行的效果,正是因为该程序实现了对计算机信息系统的控制,才能得以决定程序运行的顺序。

记录键盘的动作和敲击按键时的时间

记录键盘的动作和敲击按键时的时间

记录键盘的动作和敲击按键时的时间日志钩子代码如下,你慢慢品味吧://-----------.cpp文件//---------------------------------------------------------------------------#include <vcl.h>#include <stdio.h>#pragma hdrstop#include "KeyHookU.h"//---------------------------------------------------------------------------#pragma package(smart_init)#pragma resource "*.dfm"TfrmLogHook *frmLogHook;HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam);//钩子变量HHOOK g_hLogHook=NULL;//记录上一次得到焦点的窗口句柄HWND g_hLastFocus=NULL;//键盘掩码变量const int KeyPressMask=0x80000000;//保存上一次按键值//char g_PrvChar;//---------------------------------------------------------------------------__fastcall TfrmLogHook::TfrmLogHook(TComponent* Owner): TForm(Owner){}//---------------------------------------------------------------------------void __fastcall TfrmLogHook::btnInstallClick(TObject *Sender){if(g_hLogHook==NULL)//安装日志钩子g_hLogHook=SetWindowsHookEx(WH_JOURNALRECORD,(HOOKPROC)JournalLogProc,HInstance,0); }//---------------------------------------------------------------------------void __fastcall TfrmLogHook::btnUninstallClick(TObject *Sender){if(g_hLogHook!=NULL){UnhookWindowsHookEx(g_hLogHook);g_hLogHook=NULL;}}//--------------------------------------------------------------------------- HOOKPROC JournalLogProc(int iCode,WPARAM wParam,LPARAM lParam){if(iCode<0)return (HOOKPROC)CallNextHookEx(g_hLogHook,iCode,wParam,lParam);if(iCode==HC_ACTION){EVENTMSG* pEvt=(EVENTMSG*)lParam;int i;HWND hFocus;//保存当前活动窗口句柄char szTitle[256];//当前窗口名称char szTime[128];//当前的日期和时间FILE* stream=fopen("h:\\usr\\logfile.txt","a+");if(pEvt->message==WM_KEYDOWN){int vKey=LOBYTE(pEvt->paramL);//取得虚拟键值char ch;char str[10];hFocus=GetActiveWindow();if(g_hLastFocus!=hFocus){GetWindowText(hFocus,szTitle,256);g_hLastFocus=hFocus;strcpy(szTime,DateTimeToStr(Now()).c_str());fprintf(stream,"%c%s%c%c%s",10,szTime,32,32,szTitle);fprintf(stream,"%c%c",32,32);}int iShift=GetKeyState(0x10);int iCapital=GetKeyState(0x14);int iNumLock=GetKeyState(0x90);bool bShift=(iShift&KeyPressMask)==KeyPressMask;bool bCapital=(iCapital&1)==1;bool bNumLock=(iNumLock&1)==1;/*if(vKey==9) //TABfprintf(stream,"%c",'\t');if(vKey==13) //回车键fprintf(stream,"%c",'\n');*/if(vKey>=48 && vKey<=57) //数字键0-9{if(!bShift)fprintf(stream,"%c",vKey);else{switch(vKey){case 49:ch='!';break;case 50:ch='@';break;case 51:ch='#';break;case 52:ch='$';break;case 53:ch='%';break;case 54:ch='^';break;case 55:ch='&';break;case 56:ch='*';break;case 57:ch='(';break;case 48:ch=')';break;}fprintf(stream,"%c",ch);}}if(vKey>=65 && vKey<=90) //A-Z a-z{if(!bCapital){if(bShift)ch=vKey;elsech=vKey+32;}else if(bShift)ch=vKey+32;elsech=vKey;fprintf(stream,"%c",ch);}if(vKey>=96 && vKey<=105) //小键盘0-9{if(bNumLock)fprintf(stream,"%c",vKey-96+48);}if(vKey>=186 && vKey<=222) //其它键{switch(vKey){case 186:if (!bShift) ch=';' ;else ch=':' ;break;case 187:if (!bShift) ch='=' ;else ch='+' ;break;case 188:if (!bShift) ch=',' ;else ch='<' ;break;case 189:if (!bShift) ch='-' ;else ch='_' ;break;case 190:if (!bShift) ch='.' ;else ch='>' ;break;case 191:if (!bShift) ch='/' ;else ch='?' ;break;case 192:if (!bShift) ch='`' ;else ch='~' ;break;case 219:if (!bShift) ch='[';else ch='{' ;break;case 220:if (!bShift) ch='\\' ;else ch='|' ;break;case 221:if (!bShift) ch=']';else ch='}' ;break;case 222:if (!bShift) ch='\'';else ch='\"' ;break;default:ch='n' ;break;}if (ch!='n' ) fprintf(stream,"%c",ch);} //if (vKey>=112 && vKey<=123) // 功能键 [F1]-[F12] {switch(wParam){case 112:fprintf(stream,"%s","[F1]");break;case 113:fprintf(stream,"%s","[F2]");break;case 114:fprintf(stream,"%s","[F3]");break;case 115:fprintf(stream,"%s","[F4]");break;case 116:fprintf(stream,"%s","[F5]");break;case 117:fprintf(stream,"%s","[F6]");break;case 118:fprintf(stream,"%s","[F7]");break;case 119:fprintf(stream,"%s","[F8]");break;case 120:fprintf(stream,"%s","[F9]");break;case 121:fprintf(stream,"%s","[F10]");break;case 122:fprintf(stream,"%s","[F11]");break;case 123:fprintf(stream,"%s","[F12]");break;}}if (vKey>=8 && vKey<=46) //方向键{switch (vKey){case 8:strcpy(str,"[BK]");break;case 9:strcpy(str,"[TAB]");break;case 13:strcpy(str,"[EN]");break;case 27:strcpy(str,"[ESC]");break;case 32:strcpy(str,"[SP]");break;case 33:strcpy(str,"[PU]");break;case 34:strcpy(str,"[PD]");break;case 35:strcpy(str,"[END]");break;case 36:strcpy(str,"[HOME]");break;case 37:strcpy(str,"[LF]");break;case 38:strcpy(str,"[UF]");break;case 39:strcpy(str,"[RF]");break;case 40:strcpy(str,"[DF]");break;case 45:strcpy(str,"[INS]");break;case 46:strcpy(str,"[DEL]");break;default:ch='n';break;}if (ch!='n' ){//if (g_PrvChar!=vKey)//{fprintf(stream,"%s",str);// g_PrvChar=vKey;/。

windows钩子教程(hook)

windows钩子教程(hook)

Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。

而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。

钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。

这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。

可见,利用钩子可以实现许多特殊而有用的功能。

因此,对于高级编程人员来说,掌握钩子的编程方法是很有必要的。

钩子的类型一.按事件分类,有如下的几种常用类型(1)键盘钩子和低级键盘钩子可以监视各种键盘消息。

(2)鼠标钩子和低级鼠标钩子可以监视各种鼠标消息。

(3)外壳钩子可以监视各种Shell事件消息。

比如启动和关闭应用程序。

(4)日志钩子可以记录从系统消息队列中取出的各种事件消息。

(5)窗口过程钩子监视所有从系统消息队列发往目标窗口的消息。

此外,还有一些特定事件的钩子提供给我们使用,不一一列举。

下面描述常用的Hook类型:1、WH_CALLWNDPROC和WH_CALLWNDPROCRET HooksWH_CALLWNDPROC和WH_CALLWNDPROCRET Hooks使你可以监视发送到窗口过程的消息。

系统在消息发送到接收窗口过程之前调用WH_CALLWNDPROC Hook子程,并且在窗口过程处理完消息之后调用WH_CALLWNDPROCRET Hook子程。

WH_CALLWNDPROCRET Hook传递指针到CWPRETSTRUCT结构,再传递到Hook子程。

CWPRETSTRUCT结构包含了来自处理消息的窗口过程的返回值,同样也包括了与这个消息关联的消息参数。

2、WH_CBT Hook在以下事件之前,系统都会调用WH_CBT Hook子程,这些事件包括:1. 激活,建立,销毁,最小化,最大化,移动,改变尺寸等窗口事件;2. 完成系统指令;3. 来自系统消息队列中的移动鼠标,键盘事件;4. 设置输入焦点事件;5. 同步系统消息队列事件。

DELPHIHOOK函数建立键盘鼠标动作记录与回放

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。

钩子函数捕捉键盘消息

利用钩子函数来捕捉键盘响应的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中对钩子程序并不支持。

C#捕捉键盘输入或动作

用C++写很简单,用C#写,则实际是调用windows API 类似钩子程序。

下载源程序和运行程序
/2008_11/1225788644_ddvip_7698.rar
运行界面如下:
二说明:
在C++中实现该功能十分简单,也有很多经典例子可以实现,在C#中确有很多问题会出现。

对于钩子知识不太熟悉可以参考我转载的另一篇文章:/hocyl an/articles/1033895.html[微软HOOK技术专题]
三大概步骤
其实主要就是调用windows API
第一步:安装钩子:SetWindowsHookEx(WH_Codes idHook, HookProc lpfn,IntPtr pInstance, int threadId);
第二步:回调和处理CallNextHookEx(IntPtr pHookHandle, int nCode,Int32 wParam, IntPtr lParam);
第三步:完成普通的业务处理其它流程
将封装的钩子应用到系统中…….
第四步:拆卸钩子UnhookWindowsHookEx(IntPtr pHookHandle);
四重要代码和解释:
*封装的hook类:。

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中的函数,来实现键盘和鼠标动作的记录和回放功能。

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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

利用键盘钩子捕获Windows键盘动作
2004年12月20日 07:51 天极yesky
文/郎锐
引言
在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。

通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。

通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。

这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。

由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。

这种技术便是本文将要论述的核心--系统全局钩子。

本文下面将对Win32平台下全局钩子的运行机制进行介绍并给出了一个具体的由VC++6.0编写的捕获键盘动作的键盘钩子示例程序。

系统钩子和DLL
钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。

钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。

此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。

在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。

在本程序中为方便起见采用了标准静态连接MFC DLL。

键盘钩子程序示例
本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库
LaunchDLL。

首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。

之后,在相应的头文件中添加宏定义和待导出函数的声明:
同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():
最后,完成以上提到的这几个函数的具体编码实现:
在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:
利用键盘钩子捕获Windows键盘动作(2)
2004年12月20日 07:51 天极yesky
文/郎锐
其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE 等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。

当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。

编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。

下面开始编写调用此动态连接库的主程序,并实现最后的集成。

另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态链接库复制到Debug 目录下。

然后链接DLL库:在"Project","Settings…"的"Link"属性页内,在
"Object/librarymodules:"中填入"LaunchDLL.lib"。

再通过"Project","Add To Project","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:
这样我们就可以象使用本工程内的函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。

接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:
到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面。

这只需在应用程序类CkeyHookApp的
InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为
m_pMainWnd->ShowWindow(SW_HIDE)即可。

小结
编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。

系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。

这种技术广泛应用于各种自动监控系统中。

本文所述程序在Windows 2000 Professional + SP4下由Microsoft Visual C++ 6.0编译调试通过。

相关文档
最新文档