鼠标钩子程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程报告
windows钩子程序实现
班级:
学号:
姓名:
教师评语:
教师签名:
2010年7月
课程设计题目
windows钩子程序实现
目的和背景目的:
1)更深入的学习C++,并学会在Visual C++ 6.0上编写应用程序2)了解windows钩子程序的基本原理,类型和实现过程
3)掌握用C++来设计一个钩子程序
背景:钩子的本质是一段用以处理系统消息的程序,通过系统调用,把他挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时钩子函数可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。鼠标钩子是能截获鼠标的操作,包括单击,双击,鼠标所在的位置等;而键盘钩子是截获从键盘输入的信息。
主要内容1)熟悉钩子程序在Windows操作系统的作用
2)通过找资料,学习钩子程序的基本原理,包括Windows的消息传递机制,钩子的概念,钩子的类型,钩子的实现过程
3)学习和掌握钩子函数,Win32全局钩子的运行机制,VC6中MFC DLL的分类及特点和在VC6中全局共享数据的实现
4)用C++编写一个windows钩子程序;实现适时获取当前鼠标所在窗口的标题和监视各种键盘消息,如,把把鼠标所在窗口标题显示在一个EDITBOX中,从键盘输入的信息记录在一个文档里
采用的工具方法Windows XP 操作系统,Visual C++ 6.0
进度安排1)18周周(三)—18周周(四):查找相关的资料,对钩子程序的相关知识进行全面的了解
2)18周周(五)—19周周(一):对程序进行分析,并加强有关方面的知识,如,C++编程的能力
3)19周周(二)—19周周(三):学习了解Win32全局钩子的运行机制,VC6中MFC DLL的分类及特点和在VC6中全局共享数据的实现
4)19周周(四)—20周周(一):编码实现windows钩子程序,并实现相应的功能
5)20周周(二)—20周周(三):进行程序测试
参考资料[1] 王育坚.Visual C++面向对象编程教程(第2版)[M].北京:清华
大学出版社,2007.10.
[2] 王西武,阎梅,赵怀勋. 在VC6下应用Windows系统钩子技术
[J]. 现代电子技术 . 2004:27(17) .
[3] 徐士良.常用算法程序集:C++语言描述(第4版)[M].北京:清华
大学出版社,2009.7.
[4] 钱能.C++程序设计教程:设计思想与实现(修订版)[M].北京:清华
大学出版社.2009.7.
[5] 游洪跃, 伍良富, 王景熙.C++面向对象程序设计实验和课程设计
教程[M].北京:清华大学出版社,2009.2.
[6]倪步喜.Windows的钩子技术及实现[J].计算机与现代化.2007,28
(1):28-30.
1目的和背景
钩子的本质是一段用以处理系统消息的程序,通过系统调用,把他挂入系统。钩子的种类很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时钩子函数可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。鼠标钩子是能截获鼠标的操作,包括单击,双击,鼠标所在的位置等;而键盘钩子是截获从键盘输入的信息。
通过这个课程设计,目的是更深入的学习C++,并学会在Visual C++ 6.0上编写应用程序,了解windows钩子程序的基本原理,类型和实现过程,掌握用C++来设计一个钩子程序。
2设计想思
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。由此,我们建立一个鼠标和键盘钩子,把它挂入系统,鼠标钩子是能截获鼠标所指的窗口的标题,而键盘钩子是截获从键盘输入的字符。因为要建立的是全局钩子,要Win32的运行机制,并且在Visual C++6.0中用Win32 DLL来构造动态链接库。
3函数与数据结构
(1)函数SetWindowsHookEx
要实现Win32的系统钩子,必须调用SDK中的API函数SetWindowsHookEx来安装这个鼠标和键盘钩子,这个函数的原型是
HHOOKSetwindowsHookEx(int idHook,HOOKPROC Lpfn,INSTANCE hMod,DWORD dwTreadId)
参数:
idHook:表示钩子类型,它是和钩子函数类型一一对应的。比如,
WH_KEYBOAR,表示安装的是键盘钩子,WH_MOUSE表示是鼠标钩子等。
Lpfn:是钩子函数的地址。
HMod:是钩子函数所在的实例的句柄。对于线程钩子,该参数为NULL;对
于系统钩子,该参数为钩子函数所在的DLL句柄。
dwThreadId :指定钩子所监视的线程的线程号。对于全局钩子,该参数为
NULL。
SetWindowsHookEx:返回所安装的钩子句柄。
值得注意的是线程钩子和系统钩子的钩子函数的位置有很大的差别。线程钩子一般在当前线程或者当前线程派生的线程内,而系统钩子必须放在独立的动态链接库中。
(2)函数WINAPI DllMain
当一个进程或线程载入和卸载DLL时,都要调用该函数,它的原型是
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved);
其中:
第一个参数hinstDLL:表示DLL的实例句柄;
第二个参数fdwReason:它有四个可能的值:DLL_PROCESS_ATTACH(进
程载入),DLL_THREAD_ATTACH(线程载入),DLL_THREAD_DETACH
(线程卸载),DLL_PROCESS_DETACH (进程卸载),在DLLMain函数
中可以对传递进来的这个参数的值进行判别,并根据不同的参数值对DLL进
行必要的初始化或清理工作。举个例子来说,当有一个进程载入一个DLL时,
系统分派给DLL的第二个参数为DLL_PROCESS_ATTACH,这时,你可以