mouse

 '-------------------------------------------
' 模拟鼠标的左键单击和右键单击
'-------------------------------------------
' 洪恩在线 求知无限
'-------------------------------------------
'程序说明:
'本例采用API函数实现模拟的鼠标事件,程序运行后会
'产生十分有趣的效果。也来试一试。
'本例中只使用了相对鼠标坐标,我们也可以使用绝对
'鼠标坐标来试一试。
'-------------------------------------------

'【VB声明】
' Private 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)

'【说明】
' 模拟一次鼠标事件

'【备注】
' 进行相对运动的时候,由SystemParametersInfo函数规定的系统鼠标轨迹速度会应用于鼠标运行的速度

'【参数表】
' dwFlags -------- Long,下述标志的一个组合
' MOUSEEVENTF_ABSOLUTE
' dx和dy指定鼠标坐标系统中的一个绝对位置。在鼠标坐标系统中,屏幕在水平和垂直方向上均匀分割成65535×65535个单元 -
' MOUSEEVENTF_MOVE 移动鼠标
' MOUSEEVENTF_LEFTDOWN 模拟鼠标左键按下
' MOUSEEVENTF_LEFTUP 模拟鼠标左键抬起
' MOUSEEVENTF_RIGHTDOWN 模拟鼠标右键按下
' MOUSEEVENTF_RIGHTUP 模拟鼠标右键抬起
' MOUSEEVENTF_MIDDLEDOWN 模拟鼠标中键按下
' MOUSEEVENTF_MIDDLEUP 模拟鼠标中键抬起
' dx ------------- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定水平方向的绝对位置或相对运动'

' dy ------------- Long,根据是否指定了MOUSEEVENTF_ABSOLUTE标志,指定垂直方向的绝对位置或相对运动

' cButtons ------- Long,未使用

' dwExtraInfo ---- Long,通常未用的一个值。用GetMessageExtraInfo函数可取得这个值。可用的值取决于特定的驱动程序

 

 

  1. '对API变量的定义
    Const MOUSEEVENTF_LEFTDOWN = &H2
    Const MOUSEEVENTF_LEFTUP = &H4
    Const MOUSEEVENTF_MIDDLEDOWN = &H20
    Const MOUSEEVENTF_MIDDLEUP = &H40
    Const MOUSEEVENTF_MOVE = &H1
    Const MOUSEEVENTF_ABSOLUTE = &H8000
    Const MOUSEEVENTF_RIGHTDOWN = &H8
    Const MOUSEEVENTF_RIGHTUP = &H10
  2. ''鼠标模拟
  3. Private 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)
  4.      
  5. ''鼠标位置
  6. Public Type POINTAPI
  7.     x As Long
  8.     y As Long
  9. End Type
  10. Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  11.      
  12. '如果同时要模拟两个鼠标事件,可以用 Or 将两个参数连接
  13. '调用了mouse_event函数,其参数的设置见前面说明
  14. '1单击,2右单击,3左双击,4上滚,5,下滚,0移动
  15. ''参数:动作,X,Y,返回?
  16. Public Sub set_mouse(Clk_type As Long, Optional x As Variant = 0, Optional y As Long = 0, Optional isBack As Boolean = False)
  17.     Dim mouseven As Long
  18.     Dim msP As POINTAPI, newMsp As POINTAPI
  19.     mouseven = 0
  20.     
  21.     newMsp.x = x
  22.     newMsp.y = y
  23.     Debug.Print TypeName(x)
  24.     If x > 0 Or y > 0 Then mouseven = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
  25.     
  26.     ''如果需要返回,则记录原位置
  27.     If isBack Then GetCursorPos msP
  28.     
  29.     If Clk_type = 1 Then '这里是 鼠标左键按下 和松开两个事件的组合即一次单击
  30.         mouse_event mouseven Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
  31.     ElseIf Clk_type = 2 Then '模拟鼠标右键单击事件,
  32.         mouse_event mouseven Or MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, newMsp.x, y, 0, 0
  33.     ElseIf Clk_type = 3 Then '两次连续的鼠标左键单击事件 构成一次鼠标双击事件
  34.         mouse_event mouseven Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
  35.         mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
  36.     ElseIf Clk_type = 4 Then '上滚
  37.         mouse_event mouseven Or MOUSEEVENTF_MIDDLEUP, newMsp.x, y, 0, 0
  38.     ElseIf Clk_type = 5 Then '下滚
  39.         mouse_event mouseven Or MOUSEEVENTF_MIDDLEDOWN, newMsp.x, y, 0, 0
  40.     Else
  41.         mouse_event mouseven, newMsp.x, y, 0, 0
  42.     End If
  43.     
  44.     ''如果需要返回,则记录原位置
  45.     If isBack Then set_mouse 0, msP.x, msP.y, False
  46. End Sub
  47. Public Sub getMsPos(msPos As POINTAPI)
  48.     GetCursorPos msPos
  49. End Sub