自从使用.NET WinForm后已经很长时间没用VC++ MFC写过程序了,今天一问友给出一道VC++的题。
题目:使用钩子(HOOK)实现鼠标在屏幕上移动时实时捕获当前位置坐标,并在程序对话框的文本框中实时显示。
要求:不是仅捕获鼠标在程序窗口客户区时的坐标值,而是当鼠标移出程序窗口客户区也能捕获到鼠标在屏幕中的位置坐标。
实现思路:由于局部钩子只能监视本进程内的某个指定线程的事件消息,而按照此程序要求程序窗口不是活动窗口时也能监视到鼠标位置并将坐标值传给主程序的消息处理程序进行处理,所以需要使用系统钩子(全局钩子)。又由于要捕获鼠标信息,所以要用鼠标钩子,也就是在注册钩子时将类型为WH_MOUSE。该钩子要捕获WM_MOUSEMOVE消息并将消息传递给主程序的OnMouseMove()鼠标移动消息处理函数来进行处理,并将捕获的鼠标位置坐标值显示在对话框的Edit控件中。
&&&&&&& 实现最终效果如下图,左边的图片浏览器是活动窗口,鼠标指针也在左边的窗口中,右边的程序窗口依然能获取鼠标位置并在文本框中显示坐标。
实现步骤(仅列出关键代码):
一、编写全局钩子DLL
&&&&& 全局钩子必须单独的编写成dll文件。在VC++中新建一DLL项目,命名为"hook",该钩了的dll入口函数代码就不给出了。主要看钩子***函数InstallMyHook、卸载函数UninstallMyHook以及回调函数hookproc。
InstallMyHook钩子***函数代码如下:
---------------------------------------------------------------------------------------------------------------------- __declspec(dllexport) BOOL InstallMyHook(HWND hWnd){
&&&& //调用SetWindowsHookEx函数注册钩子,hInst是本钩子当前实例句柄,在本DLL入口函数中被赋值 &&&& hook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)hookproc,hInst,0);&&&&&&&&&&&
&&& &if(!hook){&return FALSE;}&&&&&&&&& &//如果注册失败返回FALSE
&&&&&hWndMain = hW&&&&&&&&&&& //hWndMain保存着调用此DLL的窗口句柄,是调用DLL的时候传进来的啦。 &&& return TRUE;&&&&&&& //钩子注册成功返回TRUE } // HOOK***函数
----------------------------------------------------------------------------------------------------------------------
该段代码的主要部分是钩子注册函数SetWindowsHookEx,它的主要框架如下:
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,&& HINSTANCE hMod, DWORD dwThreadId);
int idHook &&&&&: 要捕获消息的类型,因为我要捕获鼠标的,所以在此处设为WH_MOUSE;
HOOKPROC lpfn&&&&&&&&:捕获消息的处理函数,就是说捕获到消息后由哪个函数去处理;
HINSTANCE hMod&&&&&&&&: 如果是全局函数的DLL,则此参数为DLL当前实例的句柄,否则为NULL;
DWORD dwThreadId&&:与***的钩子线程相关联的线程ID,如果是全局钩子此参数设为0;
UninstallMyHook钩子卸载函数代码如下:
---------------------------------------------------------------------------------------------------------------------- __declspec(dllexport) BOOL UninstallMyHook(HWND hWnd) { &if(hWnd != hWndMain || hWnd == NULL) return FALSE; &&& BOOL unhooked = UnhookWindowsHookEx(hook);&&
//调用UnhookWindowsHookEx函数卸载钩子&&& if(unhooked) hWndMain = NULL; &&& } //Hook卸载函数
----------------------------------------------------------------------------------------------------------------------
hookproc钩子回调函数代码如下:
----------------------------------------------------------------------------------------------------------------------
static LRESULT CALLBACK hookproc(UINT nCode, WPARAM wParam, LPARAM lParam)
&&& if(wParam == WM_MOUSEMOVE)&&&&&&&&//只处理WM_MOUSEMOVE消息
&&&&&& MOUSEHOOKSTRUCT *&& //鼠标HOOK结构体
&&&&&& mhookstruct = (MOUSEHOOKSTRUCT*)lP
&&&&&& POINT pt = mhookstruct-&
&&&&&& //将当前鼠标坐标点的x,y坐标作为参数向主程序窗口发送消息
&&&&&& PostMessage(hWndMain,WM_MOUSEMOVE,MK_CO***OL,MAKELPARAM(pt.x,pt.y)); &&&
&&& return CallNextHookEx(hook,nCode,wParam,lParam);
----------------------------------------------------------------------------------------------------------------------
二、编写主程序
(1)在主程序窗口的&启动&按钮单击事件中添加代码:
&&&&&& hookState = InstallMyHook(m_hWnd)&&&&&&&& //hookState是一BOOL型变量,保存钩子***函数的返回值
&&&&&& 注:在程序退出时需要及时卸载钩了,调用UninstallMyHook(m_hWnd)就可以卸载钩子,在此不作详细说明。
(2)编写主程序OnMouseMove()消息处理函数代码:
----------------------------------------------------------------------------------------------------------------------
void mouseDlg::OnMouseMove(UINT nFlags, CPoint point)
&&&if(hookState)&&&&//判断钩子是否为开启状态
&&&&&&str.Format("X:%d& Y:%d", point.x, point.y);&& //格式化鼠标坐标点信息并保存到CString型变量str中
&&&&&&GetDlgItem(IDC_EDIT1)-&SetWindowText(str);&&&&//更新程序窗口Edit控件文本
&&&CDialog::OnMouseMove(nFlags, point);&&//调用基类MouseMove消息处理
----------------------------------------------------------------------------------------------------------------------
三、结束语
&& 至此使用全局钩子实现鼠标坐标值实时捕获实现过程说明完毕。
&& 简单吧!就那么几步。当然,这个小程序太简单了,没有实际用处,只是今天正好在问问遇到了此问题,所以把我的解决方法贴出来了,希望对初学钩子使用的网友有点用处。
Views(...) Comments()千里之行 始于足下精诚所至 金石为开
欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 2238 人关注过本帖
标题:如何隐藏打开一个mfc界面,然后进行模拟鼠标点击,整个过程不能有窗口出现, ...
等 级:新手上路
帖 子:26
结帖率:100%
&&已结贴√
&&问题点数:0&&回复次数:9&&&
如何隐藏打开一个mfc界面,然后进行模拟鼠标点击,整个过程不能有窗口出现,鼠标不能动。
问题如题,不知道如何实现,谢谢!
搜索更多相关主题的帖子:
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
&&得分:20&
透明化???
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
需求可否更细致些
等 级:新手上路
帖 子:26
回复 3楼 hahayezhe
现在需要让做好的软件(mfc)界面可以隐藏,也就是后台运行,同时我需要在隐藏的界面上实现模拟鼠标的点击,不知道如何实现。
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
鼠标钩子&&将鼠标坐标点保存,
有了这个保存的坐标点 显示的时候就很好处理了
等 级:新手上路
帖 子:26
以下是引用hahayezhe在 17:10:11的发言:
鼠标钩子&&将鼠标坐标点保存,
有了这个保存的坐标点 显示的时候就很好处理了鼠标钩子需要截获实际鼠标所在的坐标点,但是我需要在窗口一启动就将窗口隐藏,后台运行,再模拟鼠标点击,真正的鼠标是不动的,最后只要模拟鼠标一系列的动作(点击button,点击空白处等动作)后返回一个true或者其他的变量给窗口就好了,这个不知道如何实现。
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
启动时就将钩子启动就是了 在对话框初始化 直接showwindow(SW_HIDE)不可以么
将钩子的启动放到 初始化函数里 也就是那个OnInitDialog 里不就可以了么
将屏幕区域看成一个二维数组,孙鑫的钩子里有相关源码的(全局钩子) 多找找这个需求不难的
等 级:新手上路
帖 子:26
以下是引用hahayezhe在 22:50:03的发言:
启动时就将钩子启动就是了 在对话框初始化 直接showwindow(SW_HIDE)不可以么
将钩子的启动放到 初始化函数里 也就是那个OnInitDialog 里不就可以了么
将屏幕区域看成一个二维数组,孙鑫的钩子里有相关源码的(全局钩子) 多找找这个需求不难的嗯,我试试哦--
等 级:新手上路
帖 子:26
回复 7楼 hahayezhe
大哥,你好像理解错我描述的意思了,用钩子是截获该线程或者全局的鼠标活动和键盘输入的。我现在需要的是隐藏好的软件能实现在它上面模拟点击button control,而前台是看不出来鼠标有所变化的。我最终是想实现从命令行传入参数,直接后台运行程序,最后返回一个结果就可以了。因此需要实现在软件上的一系列的点击button。
等 级:新手上路
帖 子:26
求解决办法啊……
版权所有,并保留所有权利。
Powered by , Processed in 0.025232 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved&&&&vc6鼠标低级钩子源码 直接编译运行即可(滚轮,单击)。
&vc6鼠标低级钩子源码 直接编译运行即可(滚轮,单击)。
vc6下的钩子源码实例,编译运行后 点***可在窗体显示鼠标单击 移动 滚轮等信息,移动到任何地方均可显示。
若举报审核通过,可奖励20下载分
被举报人:
gzzxbcxm2005
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动***等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
vc6鼠标低级钩子源码 直接编译运行即可(滚轮,单击)。
所需积分:3
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
vc6鼠标低级钩子源码 直接编译运行即可(滚轮,单击)。
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员