IT界的十大之谜之一:mouse_event模拟点击时坐标参数无效?!
实现远程屏幕控制必不可少的函数之一就是mouse_event(或者SendInput),这个函数可以用来模拟鼠标移动、单击、双击等功能,但是描述这个函数的文档可谓少之又少,几段雷同的代码转来转去就是没有一些深入讨论的,MSDN中描述也语焉不详。在昨天试验中发现一个问题,希望有研究的“同志”能够帮我解答,^_^
在如下模拟鼠标单击的代码中,我希望在相对屏幕左上角(10, 10)的位置点击一下:
1 int dx = 10 * 65535 / 1024;
2 int dy = 10 * 65535 / 768;
3
4 mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTDOWN, dx, dy, 0, 0
mouse_event MOUSEEVENTF_ABSOLUTE Or MOUSEEVENTF_LEFTUP, dx, dy, 0,0
无论从哪个角度看,上面这段代码也是没啥问题的,过程相当简单,首先进行坐标变换,然后两次调用mouse_event模拟鼠标按下和弹起,然而,代码的运行效果却出乎我的意料,程序并没有在(10, 10)的位置模拟鼠标单击事件,而是在当前光标位置触发鼠标单击!注意,是当前!!!
经过多次验证,发现对于鼠标点击而言,dx、dy这两个参数好像不起作用,无论对这两个参数设置什么值,鼠标点击事件永远在当前位置触发!
请不要再转msdn的过来了,而且也不要转载网上那些千篇一律的文章,我已经看过很多了,都没有答到点子上,望深有同感的兄弟们共同探讨~~~
[解决办法]
我每次都是先MOUSEEVENTF_MOVE,然后再MOUSEEVENTF_LEFTDOWN、MOUSEEVENTF_LEFTUP
[解决办法]
不知道为什么会这样。
也许只有在 MOUSEEVENTF_MOVE 中坐标才是有效的,其它的都会忽略坐标参数。
解决方法是:
①先用 MOUSEEVENTF_ABSOLUTE OR MOUSEEVENTF_MOVE 按绝对坐标把鼠标移动到目标位置。
②模拟按键点击。
如果你是想‘干点坏事’不让别人察觉,多加两项操作:
①读取当前鼠标位置。
②用 MOUSEEVENTF_ABSOLUTE OR MOUSEEVENTF_MOVE 按绝对坐标把鼠标移动到目标位置。
③模拟按键点击。
④用 MOUSEEVENTF_ABSOLUTE OR MOUSEEVENTF_MOVE 把鼠标移回原来的位置。
[解决办法]
你试过
SendInput