近期在用VB编写一个模拟鼠标的小程序,期间遇到了使用mouse_event的move问题.
先放声明(这只是mouse_event的声明,其他的没放上):
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_MOVE = &H1 '移动鼠标
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '模拟鼠标左键按下
Public Const MOUSEEVENTF_LEFTUP = &H4 '模拟鼠标左键抬起
Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '模拟鼠标右键按下
Public Const MOUSEEVENTF_RIGHTUP = &H10 '模拟鼠标右键抬起
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '模拟鼠标中键按下
Public Const MOUSEEVENTF_MIDDLEUP = &H40 '模拟鼠标中键抬起
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '标示是否采用绝对坐标
声明函数,注意mouse_event要使用小写,大写首字母会出错……(刚开始因为强迫症改成了大写结果报错)
经过系列实验,各种排错,得到的解决方案如下:
SetCursorPos sPos.X, sPos.Y
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
Delay 1
mouse_event MOUSEEVENTF_ABSOLUTE & MOUSEEVENTF_MOVE, (sPos.X + Xadd) * 65535 / 1920 * 1.25, (sPos.Y + Yadd) * 65535 / 1080 * 1.25, 0, 0
Delay 1
mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
因为模拟单击双击的代码网上说的也没有太大问题所以略过,对于移动时的效果,本人选择使用绝对坐标(MOUSEEVENTF_ABSOLUTE & MOUSEEVENTF_MOVE),但这个函数是将屏幕划分为65535*65535的点,而不是分辨率的点(本人为1920 * 1080),故要进行坐标转换,具体是
X÷横向分辨×65535,Y÷纵向分辨率×65535
代码中SPos便是开始移动时的位置(X,Y),Xadd和Yadd为位移量,这两个量均是相对于屏幕分辨率(1920 * 1080)而言的;MOUSEEVENTF_LEFTDOWN和MOUSEEVENTF_LEFTUP则对应左键按下抬起,这整个过程就模拟出左键按下——拖动——左键抬起的过程.
图上便是根据指令在画图中绘出的图案,不过有一点问题的是程序会在完成move后自动点击右键(即图中黑线结尾的白点,画图中右键为背景色)……很迷,求各位大佬解答.