2012-03-21 21:04:01|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, 操作系统|来源:唯设编程网
// 安装钩子函数
BOOL CMouseHook::startHook(HWND hWnd)
{
glhDisplayWnd=hWnd;
//
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
//设置显示目标窗口标题编辑框的句柄
return bResult;
}
安装钩子的成员函数接受一个HWND的形参,用于向其发送关注的鼠标事件消息,启动鼠标钩子主要用到了api函数SetWindowsHookEx,其参数MouseProc是一个全局函数,该函数的具体定义我们将在后续内容介绍。安装钩子函数SenWindowsHookEx的原型如下:
HHOOK SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId );
该函数将一个应用程序定义的挂钩处理过程安装到挂钩链中去,您可以通过安装挂钩处理过程来对系统的某些类型事件进行监控,这些事件与某个特定的线程或系统中的所有事件相关。更详细的用法请参考MSDN。
// 卸载钩子函数
BOOL CMouseHook::stopHook(void)
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL;//清变量
glhHook=NULL;
}
}
return bResult;
}
该函数实现钩子的卸载和CMouseHook类的清理工作,卸载钩子用到的api函数是UnhookWindowsHookEx,该函数的原型如下:
BOOL UnhookWindowsHookEx( HHOOK hhk );
参数hhk是一个鼠标钩子的ID,即SetWindowsHookEx的返回值,该函数的返回值表示卸载钩子是否成功。
该函数是鼠标钩子的具体实现函数,不能是类的成员函数,必须申明为全局函数,其申明形式如下:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
//钩子函数的实现
LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam);
CMouseHook::CMouseHook(void)
{
}
MouseProc函数的的主要功能是对鼠标事件进行判断,如果是我们关心的鼠标事件,则将其以消息的方式发送到预先设定接收消息的窗口进行处理。具体实现代码如下:
//钩子函数的实现
LRESULT WINAPI MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
{
//鼠标中键按下或者弹起
if (nCode>=0&&(wParam==WM_MBUTTONUP||wParam==WM_MBUTTONDOWN))
{
if(IsWindow(glhDisplayWnd))
SendMessage(glhDisplayWnd,WM_HOOK_LBUTTONUP,wParam,lParam);
}
return CallNextHookEx(glhHook,nCode,wParam,lParam);//继续传递消息
}
到此,一个使用VC实现的鼠标钩子DLL便完成了,用它来监视鼠标事件,将会让我们的程序实现更多个性化的功能。