线程钩子(鼠标钩子)

线程钩子(鼠标钩子)

最近再看一些关于Hook方面的知识,这是一个线程钩子的实例(来源互联网):

步骤:

一、新建一个不使用文档/视结构的单文档应用hook1。打开childview.cpp文件,加入全局变量:

[cpp]HHOOK hHook;//鼠标钩子句柄
CPoint point;//鼠标位置信息
CChildView *pView;//鼠标钩子函数用到的输出窗口指针 [/cpp]

二、在CChildView::OnPaint()添加如下代码:

[cpp]CPaintDC dc(this); // 用于绘制的设备上下文
CString str;
str.Format(_T(“x=%d,y=%d by:cplusplus.me”),point.x,point.y);
dc.TextOut(200,200,str); //显示字符串[/cpp]

三、在childview.cpp文件中定义全局的鼠标钩子函数。

[cpp]LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{//是鼠标移动消息
if(wParam==WM_MOUSEMOVE||wParam
==WM_NCMOUSEMOVE)
{
point=((MOUSEHOOKSTRUCT *)lParam)->pt;
//取鼠标信息
pView->Invalidate(); //窗口重画
}
return CallNextHookEx(hHook,nCode,wParam,lParam);
//传递钩子信息
}
[/cpp]

四、CChildView类的构造函数中安装钩子。

[cpp]pView=this;//获得输出窗口指针
hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,0,GetCurrentThreadId()); [/cpp]

五、CChildView类的析构函数中卸载钩子。

[cpp]if(hHook)
UnhookWindowsHookEx(hHook); [/cpp]

运行结果:

hook1
hook1