1. 程式人生 > >滑鼠API函式(windows)

滑鼠API函式(windows)

得到當前滑鼠指標的座標:GetCursorPos函式
宣告:
public Type POINTAPI
x As Long
y As Long
End Type
Public Declare Function GetCursorPos Lib "user32" _
(lpPoint As POINTAPI) As Long 引數預設為byref指標傳遞
呼叫:先宣告一個自定義型別變數: Dim z As POINTAPI
Private Sub Timer1_Timer()
GetCursorPos z 注:這裡z是引用地址傳遞,其值改變,就象"返回值"
Label1.Caption = z.x
Label2.Caption = z.y
End Sub
引數lpPoint返回滑鼠在螢幕上座標(不限於程式窗體),如將滑鼠指標移到螢幕左上角時,z.x=0,z.y=0,而滑鼠移到螢幕右下角時,z.x=639;z.y=477
===========================================================
設定滑鼠在螢幕上的座標 : SetCursorPos函式
宣告:
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
呼叫如:Private Sub Command1_Click()
Call SetCursorPos(600, 100) 將滑鼠定位到螢幕(600,100)處。
End Sub
很簡單,注:螢幕是以象素為單位的(與螢幕解析度設定有關)。不是緹。
==========================================================
自動按下滑鼠按紐:mouse_event過程函式
該過程能在程式中模擬手工按下或擡起滑鼠,移動滑鼠的操作,宣告:
Public 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)
一般只用它的第1個引數,指明按下或擡起哪個按紐,如果要模擬滑鼠移動,則要用到第2,3個引數dx和dy, 而最後面兩個引數始終不用。
第1個引數dwFlags的可能設定值如下:
MOUSEEVENTF_LEFTDOWN=&H2: 模擬滑鼠左鍵按下
MOUSEEVENTF_LEFTUP :模擬滑鼠左鍵擡起
MOUSEEVENTF_RIGHTDOWN: 模擬滑鼠右鍵按下
MOUSEEVENTF_RIGHTUP :模擬滑鼠右鍵擡起
MOUSEEVENTF_ABSOLUTE=&H8000: 由引數dx和dy指定滑鼠座標系統中的一個絕對位置。在滑鼠座標系統中,螢幕在水平和垂直方向上均勻分割成65535×65535個單元
MOUSEEVENTF_MOVE=&H1 :移動滑鼠
呼叫如:在螢幕上指定位置按下滑鼠左鍵:
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Private Sub Timer1_Timer()
SetCursorPos 300, 20
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0&
End Sub
模擬滑鼠移動需要設定其dx和dy引數來確定滑鼠位置,這時第1個引數用MOUSEEVENTF_MOVE加上MOUSEEVENTF_ABSOLUTE組合,如下:
Public Const MOUSEEVENTF_MOVE = &H1
Public Const MOUSEEVENTF_ABSOLUTE = &H8000
mouse_event MOUSEEVENTF_ABSOLUTE + MOUSEEVENTF_MOVE, 65535, 65535, 0&, 0& '移動滑鼠
mouse_event MOUSEEVENTF_LEFTDOWN, 0&, 0&, 0&, 0& '按下滑鼠
這樣可省去用SetCursorPos函式,不過它不以象素為度量單位,而是將長寬分別平分為65535個滑鼠位置點,要注意。
補充說明:
引數dx-- Long,根據是否指定了MOUSEEVENTF_ABSOLUTE標誌,指定水平方向的絕對位置或相對運動
引數dy-- Long,根據是否指定了MOUSEEVENTF_ABSOLUTE標誌,指定垂直方向的絕對位置或相對運動
==============================================
限制滑鼠活動區域函式:ClipCursor函式
限制游標只能在引數lpRect給出的矩形區域內運動。宣告:
Public Declare Function ClipCursor Lib "user32" (lpRect As RECT) As Long
引數lpRect宣告為RECT型,RECT的宣告如下:
Public Type RECT
Left As Long
Top As Long Left,Top為左上角座標。
Right As Long
Bottom As Long Right,Bottom為右下角座標。
End Type
注:以上座標使用的是螢幕座標。
呼叫如:
Dim lxnRect As RECT
Private Sub Form_Click()
Static a As Boolean
a = Not a
If a = True Then 活動範圍為Form1
lxnRect.Left = Form1.Left \ Screen.TwipsPerPixelX
lxnRect.Top = Form1.Top \ Screen.TwipsPerPixelY
lxnRect.Right = (Form1.Left + Form1.Width) \ Screen.TwipsPerPixelX
lxnRect.Bottom = (Form1.Top + Form1.Height) \ Screen.TwipsPerPixelY
ClipCursor lxnRect
Else 活動範圍為全螢幕
lxnRect.Left = 0
lxnRect.Top = 0
lxnRect.Right = Screen.Width \ Screen.TwipsPerPixelX
lxnRect.Bottom = Screen.Height \ Screen.TwipsPerPixelY
ClipCursor lxnRect
End If
End Sub
上例是這樣的,在窗體上單擊時,滑鼠活動限在此窗體,再單擊,則恢復為全螢幕活動範圍。
注:在VB中,所有尺寸都化為緹了(包括screen物件的width,height),而在API中,所有尺寸都為象素,因此,要統一單位,用轉換比例screen物件的TwipsPerPixelX和TwipsPerPixelY(好象值就等於15。不知是否固定不變。)
======================================
顯示/隱藏滑鼠指標:ShowCursor函式
該函式可用於隱藏滑鼠,但滑鼠仍然可"看不見地移動"。宣告:
Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long
引數很簡單:bShow--當為true且"函式"返回值大於等於0時,顯示指標,當為false且"函式"返回值小於0時,隱藏指標。
注:該函式的函式返回值需要注意:它返回"顯示計數",windows維持著一個內部顯示計數;倘若bShow為TRUE,那麼每呼叫一次這個函式,計數就會遞增1;反之,如bShow為FALSE,則計數遞減1。只有在這個計數大於或等於0的情況下,指標才會顯示出來。而小於0時則隱藏,因此,不單是簡單地把bShow設為false就可以了。不然要想再使指標顯示出來,可能會遇到困難。如:
Dim a As Boolean
Private Sub Form_Click()
a = False
x = ShowCursor(a)
Print x
End Sub
如果我們多次單擊form窗體,則x的值會變為-1,-2,-3,-4……這時,如果再簡單地把a改為true,則單擊1次時指標不會重顯,x的值會變為-3,-2,-1,0……只有多次單擊使x等於大於0的時候,指標才會重顯。
===========================================
在VB中捕捉mouse_leave事件:SetCapture和ReleaseCapture函式
SetCapture函式:設定滑鼠捕獲到指定視窗,使該視窗接收所有滑鼠輸入。
ReleaseCapture函式:釋放滑鼠捕獲。
宣告:
Declare Function SetCapture Lib "user32"(ByVal hwnd As Long) As Long
Declare Function ReleaseCapture Lib "user32"() As Long
引數:hwnd--要接收所有滑鼠輸入的視窗控制代碼。
呼叫如(捕捉command2的mouseleave"事件":
Private Sub Command2_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Text1.Text = X & "," & Y
Dim MouseOver As Boolean
MouseOver = (0 <= X) And (X <= Command2.Width) And (0 <= Y) And (Y <= Command2.Height) 這裡要注意,一個控制元件的mouse類事件返回的X,Y座標值是此控制元件自身的視窗座標,不是Form的座標!所以左上角都是(0,0)-右下角(width,height).
If MouseOver Then 當滑鼠在command2上時,
Command2.BackColor = RGB(255, 255, 0)
SetCapture Command2.hwnd 使command2視窗響應滑鼠輸入。
Else 當滑鼠離開時,以下寫mouseleave的內容。
Command2.BackColor = RGB(120, 120, 120)
ReleaseCapture command2不再響應滑鼠動作
End If
End Sub