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