在Windows系统中用VC++实现钩子机制
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中的实