'-------------------------------------------
' 類比滑鼠的左鍵單擊和按右鍵
'-------------------------------------------
' 洪恩線上 求知無限
'-------------------------------------------
'程式說明:
'本例採用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函數可取得這個值。可用的值取決於特定的驅動程式
- '對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 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)
-
- ''滑鼠位置
- Public Type POINTAPI
- x As Long
- y As Long
- End Type
- Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
-
- '如果同時要類比兩個滑鼠事件,可以用 Or 將兩個參數串連
- '調用了mouse_event函數,其參數的設定見前面說明
- '1單擊,2右單擊,3左雙擊,4上滾,5,下滾,0移動
- ''參數:動作,X,Y,返回?
- Public Sub set_mouse(Clk_type As Long, Optional x As Variant = 0, Optional y As Long = 0, Optional isBack As Boolean = False)
- Dim mouseven As Long
- Dim msP As POINTAPI, newMsp As POINTAPI
- mouseven = 0
-
- newMsp.x = x
- newMsp.y = y
- Debug.Print TypeName(x)
- If x > 0 Or y > 0 Then mouseven = MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE
-
- ''如果需要返回,則記錄原位置
- If isBack Then GetCursorPos msP
-
- If Clk_type = 1 Then '這裡是 滑鼠左鍵按下 和鬆開兩個事件的組合即一次單擊
- mouse_event mouseven Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
- ElseIf Clk_type = 2 Then '類比滑鼠右鍵單擊事件,
- mouse_event mouseven Or MOUSEEVENTF_RIGHTDOWN Or MOUSEEVENTF_RIGHTUP, newMsp.x, y, 0, 0
- ElseIf Clk_type = 3 Then '兩次連續的滑鼠左鍵單擊事件 構成一次滑鼠雙擊事件
- mouse_event mouseven Or MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
- mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_LEFTUP, newMsp.x, y, 0, 0
- ElseIf Clk_type = 4 Then '上滾
- mouse_event mouseven Or MOUSEEVENTF_MIDDLEUP, newMsp.x, y, 0, 0
- ElseIf Clk_type = 5 Then '下滾
- mouse_event mouseven Or MOUSEEVENTF_MIDDLEDOWN, newMsp.x, y, 0, 0
- Else
- mouse_event mouseven, newMsp.x, y, 0, 0
- End If
-
- ''如果需要返回,則記錄原位置
- If isBack Then set_mouse 0, msP.x, msP.y, False
- End Sub
- Public Sub getMsPos(msPos As POINTAPI)
- GetCursorPos msPos
- End Sub