低级鼠标钩子WH_MOUSE_LL

原文地址:http://blog.csdn.net/friendan/article/details/12168273

翻MSDN可知,鼠标钩子类型有两个,一个是WH_MOUSE,另一个是WH_MOUSE_LL,

至于它们的区别,百度了一下:

1.WH_MOUSE只能监控钩子所在模块的鼠标事件。

2.WH_MOUSE_LL可以截获整个系统所有模块的鼠标事件。

-------------------------------------------------------------------------------------------------------------------------------------

这里我测试的是WH_MOUSE_LL,毕竟比较给力嘛。文章后面给出VS2008源码和成品下载地址。

//效果截图如下:


-----------------------------------------------------------------------------------------------------------------------------------------------------

安装鼠标钩子和卸载钩子,比较简单,这里我就不详细讲了,这里主要讲的是,如何让dll和主程序进行

通信,毕竟我们的鼠标钩子存在于dll文件中,对鼠标事件的捕获也是在dll文件中实现的,我们如何将

捕获到的鼠标消息告诉给主程序呢?即我们如何将捕获到的鼠标消息显示在对话框上面呢?

-----------------------------------------------------------------------------------------------------------------------------------------------------

这里我们通过发送消息的方式,让dll和主程序进行通信。即我们捕获到鼠标消息后,马上将其发送给

主程序,主程序收到该消息后,将其显示在程序界面上。为了给主程序发送消息,在主程序调用安装

鼠标钩子的函数时,我们将主窗口的句柄通过参数传递到dll中,这样我们就可以发送消息给主程序了。

下面说一下实现步骤。

--------------------------------------------------------------------------------------------------------------------------------------------------------

一、先说dll程序

1.在dll程序中,自定义一个消息,如下所示:

#define WM_MYMSG WM_USER + 305 //自定义消息,用于和主程序通信

2.在钩子安装函数中,保存主程序的窗口句柄,代码如下:

[cpp]  view plain  copy
 print ?
  1. BOOL WINAPI StartHookMouse(HWND hWnd)  
  2. {  
  3.     g_hWnd=hWnd;  
  4.     hhkMouse=::SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,g_hInstDll,0);  
  5.     if (hhkMouse==NULL)  
  6.     {  
  7.         return FALSE;  
  8.     }   
  9.     else  
  10.     {  
  11.         return TRUE;  
  12.     }  
  13. }  
3.在鼠标钩子响应函数中,我们将捕获到的消息,发送给主程序,代码如下:

[cpp]  view plain  copy
 print ?
  1. //低级鼠标钩子过程  
  2. LRESULT CALLBACK LowLevelMouseProc(  
  3.                            int nCode,      // hook code  
  4.                            WPARAM wParam,  // message identifier  
  5.                            LPARAM lParam   // mouse coordinates  
  6.                            )  
  7. {  
  8.   
  9.     //有鼠标消息时,将其发给主程序  
  10.     if (g_hWnd!=NULL&&nCode==HC_ACTION)  
  11.     {  
  12.         ::SendMessage(g_hWnd,WM_MYMSG,wParam,lParam);  
  13.     }  
  14.     return CallNextHookEx(hhkMouse,nCode,wParam,lParam);  
  15. }  
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上就是dll程序的主要部分了,接下来我们在主程序中,调用dll中的钩子安装函数,并把自己的窗口句柄传到

dll中,然后就是处理我们在dll中自定义的消息了。主要步骤如下:

1.安装鼠标钩子时,把自身窗口句柄传到dll中,主要代码为:

StartHook(this->m_hWnd);

2.在主程序的头文件中,我们也需要自定义一个消息,且该消息一定要定义成和dll中定义的消息一样,不然会

接收不到dll发来的消息哦。

#define WM_MYMSG WM_USER + 305 //自定义消息,用于处理dll发来的消息,该消息的定义和dll中定义的消息要一模一样

3.声明消息处理函数

afx_msg LRESULT OnMyMsg(WPARAM wParam,LPARAM lParam);

4.消息映射

ON_MESSAGE(WM_MYMSG,OnMyMsg)

5.编写消息处理函数

LRESULT CHookMouseTestDlg::OnMyMsg(WPARAM wParam,LPARAM lParam)

{

//...处理消息WM_MYMSG的代码写在这里,到这一步算是大工告成了。

}

-----------------------------------------------------------------------------------------------------------------------------------------

关于MFC的消息映射,自定义消息的处理、发送等,以上我都是一笔带过了,如果你不了解这些,

百度一下即可,网上有很多的,在这里我就不重复了。需要说明的是,如果你想理解我这个程序,

前提是对MFC消息有一定的理解,能够理解自定义消息就更OK了。

-----------------------------------------------------------------------------------------------------------------------------------------

为了分析方便,以上的代码都不是很详细,具体请看原工程:

低级鼠标钩子VS2008源码.zip


低级鼠标钩子成品.zip

-------------------------------------------------------------------------------------------------------------------------------------------
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值