在Windows系统中用VC++实现钩子机制--免费毕业论文、毕业论文范文、毕业论文格式、毕业论文提纲,毕业论文网,提供计算机应用论文,计算机论文,工学论文毕业论文提纲、毕业论文范文、毕业论文格式等.
喜欢WitkeyCity.Com,请把WitkeyCity.Com告诉你QQ上的5位好友,多谢支持!
网站地图
合作联系
收藏本站

首 页 经济学论文 财政税收 证券金融 管理学论文 会计审计 工商管理 财务管理 公共管理 法学论文 理学论文 医药学论文
政治论文 社会学论文 文学论文 教育类论文 工学论文 计算机论文 艺术类论文 哲学论文 文化论文 英语论文 应用文 论文写作指导
邮电通信

   
 ·推荐免费论文
·2007县委办公室先进性教育活动工
·用科学发展观统领农业和农村经济
·计算机实习报告范文
·调查报告:大学生眼中的电子商务
·当前农村初中生学习心理的调查报
·求职信的格式和写作要点 
·英文简历写作的注意事项 
·毕业论文写作的基本要求
·计算机软件许可证协议书
 ·最近更新论文
·在电子商务中如何正确的使用数据
·大型ORACLE数据库优化设计方案
·在VB6.0数据库程序开发中使用ADO
·浅谈VFP报表打印问题
·通用网页查询函数的设计与应用
·构建校园网页面电子邮件系统
·Delphi中画布应用两则
·利用RCM2200实现以太网与异步串口
·Oracle数据库的优化
 ·推荐链接
   当前位置:首页 > 计算机论文 > 计算机应用 > 论文正文
联系我们 客户反馈

在Windows系统中用VC++实现钩子机制

来源:  [ 2007-3-8 22:23:20 ]  作者:佚名  编辑:
收藏到VIVI | 收藏到365KEY | 收藏到YOUNOTE | 收藏到博采| 收藏到天极网摘 | 收藏到和讯网摘

摘要:本文分析了在Windows环境下,什么是钩子程序以及怎样用VC++实现一个钩子机制的关键技术。最后,用一个可以截获鼠标信息的完整程序说明了这些问题。

关键词:钩子程序,DLL,消息截获

一.      什么是钩子。
Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。钩子(hook)是一种特殊的消息处理机制,钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。
钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启动和关闭应用程序的消息等。钩子可以分为线程钩子和系统钩子, 线程钩子监视指定线程的事件消息, 系统钩子监视系统中的所有线程的事件消息。因为系统钩子会影响系统中所有的应用程序,所以钩子函数必须放在独立的动态链接库(DLL) 中。

二.      实现钩子机制的几个关键技术。
1.      windows的钩子程序,需要用到几个sdk中的api函数。下面列出这几个函数的原型及说明:
hhook setwindowshookex(int idhook,hook_proc lpfn,hinstance hmod,dword dwthreadid);
参数说明如下:
  idhook:钩子的类型
  lpfn:钩子处理函数地址
  hmod:包含钩子函数的模块句柄
  dwthreadid:钩子的监控线程
函数说明:函数将在系统中挂上一个由idhook指定类型的钩子,监控并处理相应的特定消息。
bool unhookwindowshookex(hhook hhk);
函数说明:函数将撤销由hhk指定的钩子。
lresult callnexthookex( hhook hhk, int ncode,wparam wparam,lparam lparam );
函数说明:函数将消息向下传递,下一个钩子处理将截获这一消息。
2.      由于钩子的处理涉及到模块及进程间的数据地址问题,一般情况是把钩子整合到一个动态链接库(dll)中,VC中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。第一种DLL在编译时把使用的MFC代码链接到DLL中,执行程序时不需要其他MFC动态链接类库的支持,但体积较大;第二种DLL在运行时动态链接到MFC类库,因而体积较小,但却依赖于MFC动态链接类库的支持;这两种DLL均可被MFC程序和Win32程序使用。第三种DLL的也是动态连接,但做为MFC类库的扩展,只能被MFC程序使用。
另外,要设立一个全局数据共享数据段,以存贮一些全局变量,保留上次钩子消息事件发生时的状态。
3.      Win32 DLL的入口和出口函数都是DLLMain。只要有进程或线程载入和卸载DLL时,都会调用该函数,其原型是:
  BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason, LPVOID lpvReserved); 其中,第一个参数表示DLL的实例句柄;第三个参数系统保留;第二个参数指明了当前调用该动态连接库的状态,它有四个可能的值:DLL_PROCESS_ATTACH(进程载入)、DLL_THREAD_ATTACH(线程载入)、DLL_THREAD_DETACH(线程卸载)、DLL_PROCESS_DETACH(进程卸载)。在DLLMain函数中可以通过对传递进来的这个参数的值进行判别,根据不同的参数值对DLL进行必要的初始化或清理工作。由于在Win32环境下,所有进程的空间都是相互独立的,这减少了应用程序间的相互影响,但大大增加了编程的难度。当进程在动态加载DLL时,系统自动把DLL地址映射到该进程的私有空间,而且也复制该DLL的全局数据的一份拷贝到该进程空间,每个进程所拥有的相同的DLL的全局数据其值却并不一定是相同的。当DLL内存被映射到进程空间中,每个进程都有自己的全局内存拷贝,加载DLL的每一个新的进程都重新初始化这一内存区域,也就是说进程不能再共享DLL。因此,在Win32环境下要想在多个进程中共享数据,就必须进行必要的设置。一种方法便是把这些需要共享的数据单独分离出来,放置在一个独立的数据段里,并把该段的属性设置为共享,建立一个内存共享的DLL。

三.      用钩子机制实现截获鼠标左右键按压次数。
   建立钩子程序时需要把钩子处理整合到动态链接库中,所以例程中需要建立两个project。
1.      钩子处理动态链接库
(1)      选择mfc appwizard(dll)创建一个新project,命名为“spy”。
(2)      选择mfc extension dll类型。
(3)      创建一个新的头文件,命名为“hook.h”,修改它的代码如下:
extern "C" LRESULT CALLBACK mouseproc(int code,WPARAM wparam,LPARAM lparam); //钩子处理函数
extern "C" bool WINAPI starthook(); //启动钩子函数
extern "C" bool WINAPI stophook(); //撤销钩子函数
extern "C" int WINAPI getresultl(); //取得鼠标左键单击次数的函数
extern "C" int WINAPI getresultr(); //取得鼠标右键单击次数的函数
(4)      修改spy.cpp程序代码如下:
#include "hook.h"    //包含头文件hook

#pragma data_seg("publicdata") //定义全局数据段
HHOOK hhook=NULL; //钩子句柄
HINSTANCE pinstance=NULL;//钩子模块句柄
UINT mouseclickl=0; //记录鼠标左键单击次数的变量
UINT mouseclickr=0;//记录鼠标右键单击次数
#pragma data_seg()

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  { if (dwReason == DLL_PROCESS_ATTACH)
   {……  //省略部分机器生成代码
   new CDynLinkLibrary(SpyDLL);
   pinstance=hInstance;//取得模块句柄
  }
 ……;   
}

                extern "C" LRESULT CALLBACK mouseproc(int code,      WPARAM wparam,LPARAM lparam)//钩子处理函
{
     if (code<0)    //若code〈0,则直接调用callnexthookex返回
           return CallNextHookEx(hhook, code, wparam, lparam);
     if(wparam==WM_LBUTTONDOWN)
     {      mouseclickl++;//记录鼠标左键单击次数      }
     if(wparam==WM_RBUTTONDOWN)
     {            mouseclickr++;//记录鼠标右键单击次数      }
     return CallNextHookEx(hhook, code, wparam,lparam);
}

extern "C" bool WINAPI starthook()//启动钩子函数
{
     hhook=SetWindowsHookEx(WH_MOUSE,mouseproc,pinstance,0);//挂上钩子
     if(hhook!=NULL)
           return true;
     else return false;
}

extern "C" bool WINAPI stophook() //撤销钩子函数
{      return UnhookWindowsHookEx(hhook); //撤销钩子}

extern "C" int WINAPI getresultl()//返回鼠标左键单击次数
{      return mouseclickl;}

extern "C" int WINAPI getresultr()//返回鼠标右键单击次数
{      return mouseclickr;}
  
(5)      修改spy.def程序代码如下:
  exports
stophook @2
starthook @1
getresultl @3
getresultr @4
(6)   编译project,生成spy.dll文件和spy.lib文件。

本论文共2页,当前在第1页  1  2  

论文首页】【设为主页】【字体: 加入收藏】【打印本文】【回到顶部
 
上篇文章: 超市事务数据库挖掘关联规则的设计  下篇文章: 基于Windows2000开发WDM设备驱动程序的方法
网站首页 - 友情链接 - 网站地图 - 加入收藏

声明:中国论文网毕业论文资料来源于网络,如有侵犯您的权益,请立即告知,我们将删除!
联系方式: E-mail:Laozhanga@QQ.COM QQ:75931341
喜欢WitkeyCity.Com,请把WitkeyCity.Com告诉你QQ上的5位好友,多谢支持!
冀ICP备07000828号