用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧计算机应用

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

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-01-10 11:55:38

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)      生成一个单文档的可执行文件(exe)的project。
(2)      修改资源中的主选单,增加一个选单项“监控”,下有三个子选单项,分别为“启动”、“撤销”和“取出”。
(3)      在project中加入spy.lib文件。
(4)      分别修改“启动”、“撤销”和“取出”选单项的command响应函数如下:
#include "E:/DevStudio/MyProjects/spy/hook.h"  //路径可不同
void CMainFrame::OnMenuitem32771()  //“启动”选单项的响应函数
{      starthook(); }
void CMainFrame::OnMenuitem32772()  //“撤销”选单项的响应函数
{       stophook();}
void CMainFrame::OnMenuitem32773()  //“取出”选单项的响应函数
{      int resultl=getresultl();
     int resultr=getresultr();
      char buffer[80];
      wsprintf(buffer,"在程序运行期间,你共单击鼠标左键%d次,右键%d次!",resultl,resultr);
     ::MessageBox(this->m_hWnd,buffer,"message",MB_OK);
}
 编译这个project,并把spy.dll放到生成的可执行文件目录下,便可运行程序。运行时,选择“监控”选单中的“启动”选单项,钩子便开始工作,监视鼠标的活动情况;选择“撤销”选单项,系统便撤销钩子;选择“取出”选单项,程序便报告在监控期间,用户分别单击鼠标左键和右键的次数。
以上程序在windows 98,visual c++ 5.0及6.0环境下成功运行。其他类型的钩子程序的实现与此大同小异。

                                 参考文献                   
[1] Scott Sanfield Ralph Arvesen.VC++ Developer Guide.Publishing House of Electronics Industry
[2] 贺成士.win32 全局钩子在VC5中的实

上一页  [1] [2] 

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:39,328.13000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号