前两天想做一个模拟鼠标键盘点击类似于键盘精灵的小工具来减轻一些重操作的繁琐程度。由于是小操作于是不想用C#之类的做,直接开VB6来做。
本以为直接调用mouse_event进行操作定位一下需要点击的屏幕坐标,模拟鼠标移动和点击即可。但代码写下去之后发现模拟的点击没有问题,但鼠标始终不能移动。在C#中试了一下,相同的调用没有问题。进一步测试发现相对移动没有问题,加上MOUSEEVENTF_ABSOLUTE 参数需要直接移动到指定位置就失败了。


标准的声明部分如下:
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 '  mouse move
Public Const MOUSEEVENTF_LEFTDOWN = &H2 '  left button down
Public Const MOUSEEVENTF_LEFTUP = &H4 '  left button up
Public Const MOUSEEVENTF_RIGHTDOWN = &H8 '  right button down
Public Const MOUSEEVENTF_RIGHTUP = &H10 '  right button up
Public Const MOUSEEVENTF_MIDDLEDOWN = &H20 '  middle button down
Public Const MOUSEEVENTF_MIDDLEUP = &H40 '  middle button up
Public Const MOUSEEVENTF_ABSOLUTE = &H8000 '  absolute move

调用方式如下:
mouse_event MOUSEEVENTF_ABSOLUTE  or MOUSEEVENTF_MOVE, 0,0, 0, 0 '移动到左上角

由于其他参数都没有问题,唯一的问题出在绝对坐标移动上,于是重点看MOUSEEVENTF_ABSOLUTE参数传入的情况。
跟踪发现,调用时 MOUSEEVENTF_ABSOLUTE  or MOUSEEVENTF_MOVE 得到的结果为 十进制 -32767。hex(-32767)也的确等于 &H8001。进一步分析,mouse_event 函数的dwFlags 参数传入的为Long 长度4个字节 &H00008001 应为正数 &H80000001才是负数。但此时 &H8001被当做负数传递给 mouse_event 是因为默认把两个字节的十六进制数当做integer类型了。
最后的解决办法,加了一个自定义的常量声明:

Public Const MOUSEEVENTF_ABSOLUTE_MOVE = 32769 '适用于VB的绝对移动参数
调用方式:
mouse_event MOUSEEVENTF_ABSOLUTE_MOVE , 0,0, 0, 0 

解决问题。