Come posizionare il mouse su un pulsante e simulare il mouse_down dello stesso da programma, VEDENDO l'azione sul pulsante.
Inizialmente pensato per gestire il cambio immagine sui pulsanti di una calcolatrice, premendo i tasti del tastierino numerico della tastiera.
PROCEDURA
Bisogna posizionare il cursore del mouse sul pulsante e simulare il Mouse_Down.
Per posizionare (da programma) il mouse sul pulsante:
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
Le coordinate x,y devono essere espresse in pixel e sono assolute (si riferisco alla posizione sullo schermo anche se il puntatore si trova su un controllo all'interno di una form.
_____________________________________________
Le coordinate assolute si trovano con la dichiarazione:
------------ dichiarazione ------------
Private Declare Function GetWindowRect Lib "user32" (ByVal hWnd As Long, lpRect As RECT) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
---------------------------------------
Dove hwnd è l'handle del controllo implicato.
Siccome i pulsanti non hanno un handle proprio si fa riferimento a quello della form dove sono posizionati i controlli.
Dim r As Long
Dim X As Long
Dim Y As Long
Dim rc As RECT
r = GetWindowRect(Me.hWnd, rc) ' recupera le coordinate della form ("Me" indica la form su cui si sta lavorando)
X = rc.Left ' bordo sinistro della form
Y = rc.Top ' bordo superiore della form
A questo punto X e Y rappresentato le coordinate (in pixel) sullo schermo dello spigolo superiore sinistro della form.
____________________________________________
Vediamo di stabilire le coordinate assolute di un pulsante in una form.
Avendo impostato in fase di design o al load della form Me.ScaleMode = vbPixels
Pulsante.left è il valore, in pixel, della coordinata x del nostro pulsante sulla form ma relativo alla form
Pulsante.top è il valore, in pixel, della coordinata y del nostro pulsante sulla form ma relativo alla form
Questo vuol dire che se posizionamo un pulsante nell'angolo superiore sinistro di una form, i valori left e top (relativi) del pulsante saranno entrambi zero.
Per avere quelli assoluti (X1,Y1) dobbiamo sommarli a quelli della form + delle quantità da determinare.
X1= X + Pulsante.left + dx
Xy= y + Pulsante.top + dy
dx è lo spessore del bordo sinistro della form dove è posizionato il controllo (per vista vale 3)
dy è lo spessore del bordo superiore della form (dove può esserci o meno la caption del form)(per vista vale 25 con caption)
con un pulsante 32x32 pixel la mezzeria vale 16 e 16
dX = 3 + 16 + 6 ' + 6 per non averlo proprio in mezzo
dy = 25 + 16 + 5 ' + 5 idem
_____________________________________________
A questo punto si deve posizionare il cursore del mouse sul pulsante:
------------ dichiarazione ------------
Private Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y As Long) As Long
---------------------------------------
SetCursorPos X1, Y1
Scateniamo l'evento mouse_Down
------------ dichiarazione ------------
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)
Private Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down
Private Const MOUSEEVENTF_LEFTUP = &H4 ' left button up
---------------------------------------
mouse_event MOUSEEVENTF_LEFTDOWN, X1, Y1, 0, 0 ' simula il mousedown del tasto sinistro
Vediamo l'effetto
DoEvents
fermiamoci un attimo
Sleep 200
Scateniamo l'evento mouse_up
mouse_event MOUSEEVENTF_LEFTUP, X1, Y1, 0, 0 ' simula il mouseup del tasto sinistro
__________________________________________
In Codice:
Le dichiarazioni, naturalmente, tutte dopo Option explicit
SimulaPressioneMouse Command1(5)
Private Sub SimulaPressioneMouse(Ctrl As Control)
Dim r As Long
Dim X As Long
Dim Y As Long
Dim rc As RECT
r = GetWindowRect(Me.hWnd, rc) ' recupera le coordinate della form
X = rc.Left + Ctrl.Left + 25 ' costruisce le coordinate assolute del controllo
Y = rc.Top + Ctrl.Top + 40
SetCursorPos X, Y ' posiziona il mouse
mouse_event MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0 ' simula il mousedown del tasto sinistro
DoEvents ' fa vedere l'azione che altrimenti sarebbe molto veloce
Sleep 200 ' pausa in millisecondi per far vedere l'immagine del tasto premuto
mouse_event MOUSEEVENTF_LEFTUP, X, Y, 0, 0 ' simula il mouseup del tasto sinistro
End Sub
Aggiungi un commento