mouse_event的鼠标点击事件 和 使用PostMessage或者SendMessage发送的鼠标点击事件有何区别

最近在项目中遇到一个有意思的现象,增加了自己对这几个函数调用的理解。大致描述场景如下。A程序的主窗口下有个控件,我要在B程序中模拟鼠标点击该控件。

在B程序中,首先使用的是给控件发鼠标点击事件,大致代码如下,其中hwnd就是该控件的句柄。这种做法也很明确可以实现点击该控件的效果。

PostMessage(hwnd, WM_LBUTTONDOWN, NULL, MAKELONG(5, 5));

Sleep(10);

PostMessage(hwnd, WM_LBUTTONUP, NULL, MAKELONG(5, 5));

但是后来,尝试着将hwnd换成了主窗口的句柄,模拟给这个主窗口的该控件的坐标发鼠标点击消息。却发现毫无效果。

PostMessage(hwnd, WM_LBUTTONDOWN, NULL, MAKELONG(300, 300));

Sleep(10);

PostMessage(hwnd, WM_LBUTTONUP, NULL, MAKELONG(300, 300));

这个原因是为什么呢。后来用Spy++抓主窗口的消息。当鼠标点击在该控件上时候,有一堆其他的windows消息辅助着实现这个控件的点击。而当用B程序去发送消息的时候,只能捕获到简单的鼠标落下和抬起事件,中间的转发啊聚焦啊激活消息一个没有。由此可以看出,通过PostMessage或者SendMessage发送消息的方式实现B程序对A程序某界面某控件的点击,只是简单调用了该句柄下的消息回调函数而已。之所以给具体控件发送点击事件有效,因为在A程序的代码中,有对鼠标点击事件的逻辑处理。发送该消息,A程序就进入了该控件的消息处理回调函数中。

讲了PostMessage和SendMessage发送的鼠标事件,接下来再看看mouse_event。众所周知,鼠标,键盘等外设接入主机,实际就相当于接入了IO设备。而mouse_event事件,则不是简单的发消息。它是向I/O队列插入鼠标事件。

比如上面的我给主窗口发送该控件位置的点击事件无效果的情况下,可以通过如下方式来模拟人工用鼠标点击该位置。    SetCursorPos(300, 300);

 mouse_event(MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_LEFTUP,300,300,0,0);

这样就实现了模拟人工点击该控件的效果。

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值