模擬一次鼠標事件
使用API函數mouse_event可以模擬一次鼠標事件,比如左鍵單擊、雙擊和右鍵單擊等。這個實例利用此函數產生了十分有趣的效果,無論鼠標處于屏幕的任何位置,每隔一秒程序會使鼠標在那個位置單擊或雙擊一次,這會給我們造成什么樣的混亂呢?試一試就知道了。
-------------------------------------------
模擬鼠標的左鍵單擊和右鍵單擊
-------------------------------------------
程序說明:
本例采用API函數實現模擬的鼠標事件,程序運行后會
產生十分有趣的效果。也來試一試。
本例中只使用了相對鼠標坐標,我們也可以使用絕對
鼠標坐標來試一試。
-------------------------------------------
【VB聲明】
【說明】
模擬一次鼠標事件
【備注】
進行相對運動的時候,由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_Tag標示選擇了哪一種模擬事件
OnTest標示是否處于模擬狀態,以便我們停止模擬
對API變量的定義
控制 模擬的開始與結束
如果不處于模擬狀態
Command1.Caption = "快停下來吧"
如果處于模擬狀態
Command1.Caption = "試一試"
窗體加載時一些變量需要設置
選擇了模擬“鼠標左鍵單擊事件”
Option_Tag = 1 左鍵單擊事件
選擇了模擬“鼠標右鍵單擊事件”
Option_Tag = 2 右鍵單擊事件
選擇了模擬“鼠標雙擊事件”
ption_Tag = 3 雙擊事件
每隔一秒中模擬一次鼠標事件
調用了mouse_event函數,其參數的設置見前面說明
如果同時要模擬兩個鼠標事件,可以用 Or 將兩個參數連接
這里是 鼠標左鍵按下 和松開兩個事件的組合即一次單擊
模擬鼠標右鍵單擊事件
兩次連續的鼠標左鍵單擊事件 構成一次鼠標雙擊事件
先在程序中加入如下的聲明后,就能引用mouse_event函數:
其中各個參數的意義如下表所示:
程序中我們這樣使用mouse_event函數:
1、這里是鼠標左鍵按下和松開兩個事件的組合即一次單擊:
2、模擬鼠標右鍵單擊事件:
3、兩次連續的鼠標左鍵單擊事件 構成一次鼠標雙擊事件:
如上面所示如果我們要使用兩個dwFlags常數的組合時,可以用Or將其連接起來。本例中我們把dx,dy參數都設為0,是指每次模擬事件的位置是鼠標的當前位置,dx,dy在沒有使用MOUSEEVENTF_ABSOLUTE標志時是相對于鼠標當前位置的坐標,如果設置為使用絕對坐標,則dx,dy是相對于屏幕的坐標。
然后把這些語句放在Timer控件的Timer事件中,就能實現每一定間隔模擬一次鼠標事件了。
-------------------------------------------
模擬鼠標的左鍵單擊和右鍵單擊
-------------------------------------------
程序說明:
本例采用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事件中,就能實現每一定間隔模擬一次鼠標事件了。