利用键盘钩子捕获Windows键盘动作_第1页
利用键盘钩子捕获Windows键盘动作_第2页
利用键盘钩子捕获Windows键盘动作_第3页
利用键盘钩子捕获Windows键盘动作_第4页
利用键盘钩子捕获Windows键盘动作_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

利用键盘钩子捕获Windows键盘动作2004年12月20日07:51天极yesky文/郎锐引言在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。这种技术便是本文将要论述的核心一系统全局钩子。本文下面将对Win32平台下全局钩子的运行机制进行介绍并给出了一个具体的由VC++6.0编写的捕获键盘动作的键盘钩子示例程序。系统钩子和DLL钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFCDLL可供选择,即RegularstaticallylinkedtoMFCDLL(标准静态链接MFCDLL)、RegularusingthesharedMFCDLL(标准动态链接MFCDLL)以及ExtensionMFCDLL(扩展MFCDLL)。在本程序中为方便起见采用了标准静态连接MFCDLL。键盘钩子程序示例本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。首先创建一个MFCAppWizard(DLL)工程,并选择RegularstaticallylinkedtoMFCDLL(标准静态链接MFCDLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。之后,在相应的头文件中添加宏定义和待导出函数的声明:#defineDllExport__declspec(dllexport)DllExportvoidWINAPIInstallLaunchEv();classCLaunchDLLApp:publicCWinApp{public:CLaunchDLLAppO;〃{{AFX_VIRTUAL(CLaunchDLLApp)//}}AFX_VIRTUAL〃{{AFX_MSG(CLaunchDLLApp)//NOTE-theClassWizardwilladdandremovememberfunctionshere.//DONOTEDITwhatyouseeintheseblocksofgeneratedcode!//}}AFX_MSGDECLARE_MESSAGE_MAP()};同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():HHOOKHook;LRESULTCALLBACKLauncherHook(intnCode,WPARAMwParam,LPARAMlParam);voidSaveLog(char*c);最后,完成以上提到的这几个函数的具体编码实现:在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:HHOOKSetWindowsHookEx(intidHook,HOOKPROClpfn,HINSTANCEhMod,DWORDdwThreadld);利用键盘钩子捕获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","AddToProject","Files…"将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:这样我们就可以象使用本工程内的函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面。这只需在应用程序类CkeyHookApp的Initinstance()函数中将m_pMainWnd-〉ShowWindow(SW_SHOW)改为m_pMainWnd-〉ShowWindow(SW_HIDE)即可。小结编译运行程序,运行起来之后并无什么现象,但通过Alt+Ctrl+Del在关闭程序对话框内可以找到我们刚编写完毕的程序"KeyHook",随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论