现在的位置: 首页 > 综合 > 正文

mouse_event 鼠标模拟(转集)

2013年09月03日 ⁄ 综合 ⁄ 共 3034字 ⁄ 字号 评论关闭

 '-------------------------------------------
' 模拟鼠标的左键单击和右键单击
'-------------------------------------------
' 洪恩在线 求知无限
'-------------------------------------------
'程序说明:
'本例采用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 LongByVal dx As LongByVal dy As LongByVal cButtons As LongByVal 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 LongOptional 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

抱歉!评论已关闭.