top
Loading...
模擬一次鼠標事件
使用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標示是否處于模擬狀態,以便我們停止模擬

Dim OnTest As Boolean

對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()

如果不處于模擬狀態

If OnTest = False Then

Command1.Caption = "快停下來吧"

Timer1.Enabled = True
OnTest = True

如果處于模擬狀態

Else

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事件中,就能實現每一定間隔模擬一次鼠標事件了。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗