使用API函数mouse_event可以模拟一次鼠标事件,比如左键单击、双击和右键单击等。这个实例利用此函数产生了十分有趣的效果,无论鼠标处于屏幕的任何位置,每隔一秒程序会使鼠标在那个位置单击或双击一次,这会给我们造成什么样的混乱呢?试一试就知道了。
------------------------------------------- 模拟鼠标的左键单击和右键单击 ------------------------------------------- 程序说明: 本例采用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函数可取得这个值。可用的值取决于特定的驱动程序
Option Explicit 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 _ ) | Option_Tag标示选择了哪一种模拟事件
Dim Option_Tag As Integer | OnTest标示是否处于模拟状态,以便我们停止模拟
对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 | 控制 模拟的开始与结束
Private Sub Command1_Click() | 如果不处于模拟状态
Command1.Caption = "快停下来吧"
Timer1.Enabled = True OnTest = True | 如果处于模拟状态
Command1.Caption = "试一试"
Timer1.Enabled = False OnTest = False End If End Sub | 窗体加载时一些变量需要设置
Private Sub Form_Load() Option_Tag = 1 Timer1.Enabled = False OnTest = False End Sub | 选择了模拟“鼠标左键单击事件”
Private Sub Option1_Click() | Option_Tag = 1 左键单击事件
Option2.Value = False Option3.Value = False End Sub | 选择了模拟“鼠标右键单击事件”
Private Sub Option2_Click() | Option_Tag = 2 右键单击事件
Option1.Value = False Option3.Value = False End Sub | 选择了模拟“鼠标双击事件”
Private Sub Option3_Click() | ption_Tag = 3 双击事件
Option1.Value = False Option2.Value = False End Sub | 每隔一秒中模拟一次鼠标事件
Private Sub Timer1_Timer() If Option_Tag = 1 Then | 调用了mouse_event函数,其参数的设置见前面说明 如果同时要模拟两个鼠标事件,可以用 Or 将两个参数连接 这里是 鼠标左键按下 和松开两个事件的组合即一次单击
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ElseIf Option_Tag = 2 Then | 模拟鼠标右键单击事件
mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 Else | 两次连续的鼠标左键单击事件 构成一次鼠标双击事件
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 End If End Sub | 先在程序中加入如下的声明后,就能引用mouse_event函数:
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) |
其中各个参数的意义如下表所示:
参数 |
意义 |
dwFlags Long |
下表中标志之一或它们的组合 |
dx,dy Long |
根据MOUSEEVENTF_ABSOLUTE标志,指定x,y方向的绝对位置或相对位置 |
cButtons Long |
没有使用 |
dwExtraInfo Long |
没有使用 |
dwFlags常数 |
意义 |
MOUSEEVENTF_MOVE &H1 |
移动鼠标 |
MOUSEEVENTF_LEFTDOWN &H2 |
模拟鼠标左键按下 |
MOUSEEVENTF_LEFTUP &H4 |
模拟鼠标左键抬起 |
MOUSEEVENTF_RIGHTDOWN &H8 |
模拟鼠标右键按下 |
MOUSEEVENTF_RIGHTUP &H10 |
模拟鼠标右键抬起 |
MOUSEEVENTF_MIDDLEDOWN &H20 |
模拟鼠标中键按下 |
MOUSEEVENTF_MIDDLEUP &H40 |
模拟鼠标中键抬起 |
MOUSEEVENTF_ABSOLUTE &H8000 |
标示是否采用绝对坐标 |
程序中我们这样使用mouse_event函数:
1、这里是鼠标左键按下和松开两个事件的组合即一次单击:
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 | 2、模拟鼠标右键单击事件:
mouse_event MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0 | 3、两次连续的鼠标左键单击事件 构成一次鼠标双击事件:
mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 | 如上面所示如果我们要使用两个dwFlags常数的组合时,可以用Or将其连接起来。本例中我们把dx,dy参数都设为0,是指每次模拟事件的位置是鼠标的当前位置,dx,dy在没有使用MOUSEEVENTF_ABSOLUTE标志时是相对于鼠标当前位置的坐标,如果设置为使用绝对坐标,则dx,dy是相对于屏幕的坐标。
然后把这些语句放在Timer控件的Timer事件中,就能实现每一定间隔模拟一次鼠标事件了。
|