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);

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

猜你喜欢

转载自blog.csdn.net/hdy_ylmb/article/details/82949804