低级鼠标钩子WH_MOUSE_LL
翻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.在钩子安装函数中,保存主程序的窗口句柄,代码如下:
BOOL WINAPI StartHookMouse(HWND hWnd)
{g_hWnd=hWnd;hhkMouse=::SetWindowsHookEx(WH_MOUSE_LL,LowLevelMouseProc,g_hInstDll,0);if (hhkMouse==NULL){return FALSE;} else{return TRUE;}
}
3.在鼠标钩子响应函数中,我们将捕获到的消息,发送给主程序,代码如下:
//低级鼠标钩子过程
LRESULT CALLBACK LowLevelMouseProc(int nCode, // hook codeWPARAM wParam, // message identifierLPARAM lParam // mouse coordinates)
{//有鼠标消息时,将其发给主程序if (g_hWnd!=NULL&&nCode==HC_ACTION){::SendMessage(g_hWnd,WM_MYMSG,wParam,lParam);}return CallNextHookEx(hhkMouse,nCode,wParam,lParam);
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
以上就是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
您的十分满意是我追求的宗旨。
您的一点建议是我后续的动力。
低级鼠标钩子WH_MOUSE_LL相关推荐
- 游戏修改器制作教程二:键盘鼠标钩子
本教程面向有C\C++基础的人,最好还要懂一些Windows编程知识 代码一律用Visual Studio 2013编译,如果你还在用VC6请趁早丢掉它... 写这个教程只是为了让玩家更好地体验所爱的 ...
- 全局鼠标钩子:WH_MOUSE_LL, 在【 win 10 上网本】上因为太卡,运行中丢失全局鼠标钩子...
一台几年前买的上网本,让我安装了一个 win 10,然后用来测试程序的时候, 发现 使用 SetWindowsHookEx(WH_MOUSE_LL, mouseHook, GetModuleHandl ...
- [转]VSTO Office二次开发应用程序键盘鼠标钩子
可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...
- VSTO Office二次开发键盘鼠标钩子使用整理
VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...
- VSTO Office二次开发应用程序键盘鼠标钩子
可能在使用VSTO技术对Office的相关程序进行操作时,会碰到用程序去控制一些快捷键的操作,可以对键盘进行挂钩,此时使用P/Invoke函数实现. 原文链接:<VSTO应用程序中加入键盘钩子& ...
- java vk减号_[原]在全局鼠标钩子中模拟鼠标右键单击
//bSwap:BOOL型 //为TRUE为切换左右键功能,为FALSE为恢复原左右键功能 ::SwapMouseButton(bSwap); 可以使用RegisterHotKey()注册一个热键,在 ...
- 低级键盘钩子,在WIN7以上版本的问题
最近在项目用到低级键盘钩子.发现一个很奇怪的事情,在开发环境和测试环境下都正常运行的键盘钩子, 到了现场环境,总是偶发性出现 键盘钩子不能用了,而且退出时产生1404 错误. 后经过阅读MSDN 的R ...
- 使用钩子函数[3] - 建立一个全局的鼠标钩子
分两步: 一.建立 DLL, 并在 DLL 实现钩子的设置.释放和钩子函数; 二.再建一个工程调用测试. 第一步: 做 DLL 先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了): libr ...
- 用Delphi实现Windows的鼠标钩子函数
用Delphi实现Windows的鼠标钩子函数 Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助 文件中,对Windows API函数的说明沿袭了 V ...
最新文章
- Android内存管理
- GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合
- OAuth2(二)——实现
- 配置httpd虚拟主机
- Bash 实例,第 2 部分
- 某8位微型计算机地址码为18位,2015广东海洋大学计算机组成原理试题
- asp.net cookie操作-添加cookie,添加键值,移除cookie,移除键值
- mongdb group聚合操作
- 高级排序求逆序数之分治法
- 你为什么选择计算机这个专业英语,怎样选择计算机专业,英文作文:为什么选择计算机作为你的专业...
- 学习 python ORM 类库 SQLAlchemy 使用
- 如何强制修改vivado工程打开版本
- pso-svm 算法实现(1):python DEAP
- DNS是什么?DNS什么用?
- Cass10.1独立地物简码识别功能
- Python 负载均衡,数据轮询 hash字符串 hashlib
- 态度决定高度,高度决定命运。对自己要狠一点,再狠一点,因为,你要的比别人多,就必须付出得比别人多。
- 谷歌:科技让世界更美好
- 哈工大计算机网络期末复习资料知识点总结
- 什么是RSS?RSS及其发展历程