VB Tips Mouse
Come evidenziare i tab al passaggio del mouse

Per evidenziare i Tab di un TabStrip si può far riferimento alla proprietà HighLighted di un Item di un Tab; l'esempio che segue mostra come inserendo nel form un controllo TabStrip, sia possibile sfruttare questa proprietà al fine di evidenziare gli item al passaggio del mouse.

Private Declare Function SetCapture Lib "user32"
                    (ByVal hwnd As Long) As long
Private Declare Function ReleaseCapture Lib
                        "user32" () As Long
Private Sub TabStrip1_MouseMove(Button As Integer,
                            Shift As Integer, x As
single, y As Single)
SetCapture TabStrip1.hwnd
Dim i As Integer
Dim release As Boolean
release = True 
For i = 1 To TabStrip1.Tabs.Count
    If (x > TabStrip1.Tabs.Item(i).Left And _
     x < (TabStrip1.Tabs.Item(i).Left +
      TabStrip1.Tabs.Item(i).Width)) And
      (y > TabStrip1.Tabs.Item(i).Top And
        y < (TabStrip1.Tabs.Item(i).Top +
        TabStrip1.Tabs.Item(i).Height))  Then
      TabStrip1.Tabs.Item(i).HighLighted = True
      release = False
     ' HIT TEST ok: non rilascia il mouse
    Else
       TabStrip1.Tabs.Item(i).HighLighted = False
     End If
Next i
If release Then
    ReleaseCapture
End If

Check Mousebutton
If Button = 1 Then MsgBox "Hai premuto il tasto sinistro"
If Button = 2 Then MsgBox "Hai premuto il tasto destro"
If Button = 3 Then MsgBox "Hai premuto entrambi i tasti"
If Button = 4 Then MsgBox "Hai premuto il tasto in mezzo"
Come nascondere o mostrare il pulsante del mouse
Declare Function ShowCursor Lib "User 32"(ByVal bShow As Long) As Long
Public IShowCursor As Long
Public IRet As Long
Public Sub HideMouse( )
Do
IShowCursor = IShowCursor -1
IRet = ShowCursor (False)
Loop Until IRet < 0
End Sub
Public Sub ShowMouse ( )
Do
IShowCursor = IShowCursor - 1
IRet = ShowCursor (True)
Loop Until IRet >=0
Determinare la presenza del mouse destro o sinistro
Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

con la seguente costante:

Const SM_SWAPBUTTON = 23

La funzione GetSystemMetrics restituisce (in base all’indice usato nella chiamata) informazioni sul sistema e sulla sua configurazione. Utilizzandola, come in questo caso, per determinare se i pulsanti del mouse sono stati invertiti, è necessario richiamarla impostando come indice (nIndex) la costante SM_SWAPBUTTON.

Esempio
Function PulsantiScambiati() As Boolean

PulsantiScambiati = GetSystemMetrics(SM_SWAPBUTTON) <> 0
End Function

La funzione, PulsantiScambiati, restituirà True (vero), se l’utilizzatore del sistema ha invertito la logica dei due pulsati, oppure False (falso), in caso contrario.
Determinare la posizione del mouse
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

Con la  variabile del tipo POINTAPI:

Type POINTAPI
x As Long
y As Long
End Type

La funzione GetCursorPos restituisce in una variabile di tipo definito dall’utente denominata POINTAPI le coordinate x,y relative all’angolo superiore a sinistra dello schermo.

Esempio
Sub PosizioneScreenMouse()
Dim Posizione As POINTAPI
Dim PuntoX As Integer
Dim PuntoY As Integer
GetCursorPos Posizione
'per ricavare la posizione x e y
PuntoX = Posizione.x'coordinata del punto x
PuntoY = Posizione.y'coordinata del punto y
End Sub

GetCursorPos da la posizione del cursore , rispetto all’angolo superiore sinistro dello schermo. Se si desidera  conoscere la posizione del mouse, relativamente al form in uso si deve convertire i valori con:

Declare Function ScreenToClient Lib "user32" Alias "ScreenToClient" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long

La funzione ScreenToClient converte le coordinate x,y, ricavate con la funzione GetCursorPos, nelle coordinate relative all’angolo superiore sinistro di un form specificato.

Esempio
Sub PosizioneWindowMouse()
Dim Posizione As POINTAPI
Dim PuntoX As Integer
Dim PuntoY As Integer
GetCursorPos Posizione'restituisce la posizione x,y relativamente allo schermo
ScreenToClient Me.hWnd, Posizione 'converte la posizione x,y relativamente al form specificata (.hWnd)

'per ricavare la posizione x e y
PuntoX = Posizione.x'coordinata del punto x relativa al form corrente
PuntoY = Posizione.y'coordinata del punto y relativa al form corrente
End Sub

le due funzioni, GetCursorPos e ScreenToClient, restituiscono la posizione del mouse con valori espressi in pixel. Per convertire i valori in Twip :

PuntoX = Posizione.x * Screen.TwipsPerPixelX’
PuntoY = Posizione.y * Screen.TwipsPerPixelY
Determinare il numero dei pulsanti del mouse
Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

con la seguente costante:

Const SM_CMOUSEBUTTONS = 43

La funzione GetSystemMetrics retituisce (in base all’indice usato nella chiamata) informazioni sul sistema e sulla sua configurazione. Utilizzandola, come in questo caso, per determinare il numero dei pulsanti del mouse, è necessario richiamarla impostando come indice (nIndex) la costante SM_CMOUSEBUTTONS.

Esempio:

Function NumeroTasti() As Integer

NumeroTasti = GetSystemMetrics(SM_CMOUSEBUTTONS)
End Function

La funzione, NumeroTasti, restituirà il numero dei tasti presenti, oppure zero (0), nel caso non sia installato il mouse.
 

Limitare lo spostamento del mouse
Declare Function ClipCursor Lib "user32" (lpRect As Any) As Long

Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long

Con la variabile di tipo definito dall’utente di nome RECT:

Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

La funzione ClipCursor limita lo spostamento del mouse in una determinata zona dello schermo specificata in una variabile di tipo definito dall’utente ( RECT).

La funzione GetWindowRect trova i 4 vertici (Left,Top,Right,Bottom) del  perimetro della zona nella quale si vuole bloccare il mouse.

La variabile di tipo definito dall’utente denominata RECT viene usata per contenere i valori relativi alla posizione Left , Top, Right e Bottom  di un finestra rettangolare.

Esempio

Sub BloccaMouse()
Dim Perimetro As RECT' variabile che contiene i valori dei quattro vertici della zona in cui limitare lo spostamento del cursore
GetWindowRect Form1.hwnd, Perimetro'ricava l’area del form in cui limitare lo spostamento del mouse
ClipCursor Perimetro' imposta la zona entro la quale è possibile spostare il cursore
End Sub

In ugual modo è possibile, cambiando il riferimento, bloccare il cursore all’interno di un qualsiasi altro controllo che dispone della proprietà hWnd come per esempio un CommandButton.

Per ricavare le coordinate della zona dello schermo in cui si è limitato il movimento del muose, si usa funzione API:

Declare Function GetClipCursor Lib "user32" (lprc As RECT) As Long

La funzione GetClipCursor restituisce, in una variabile di tipo definito dall’utente denominata RECT, le coordinate relative ( in pixel ) ai quattro punti (Left,Top,Right,Bottom) della zona in cui  è bloccato il cursore del mouse.

Esempio
Sub GetArea()
Dim Perimetro As RECT
Dim Superiore As Integer
Dim Inferiore As Integer
Dim Destro As Integer
Dim Sinistro As Integer

GetClipCursor Perimetro'ricava le coordinate relative ai quattro vertici della zona bloccata
Superiore = Perimetro.Top' vertice superiore in pixel

Inferiore = Perimetro.Bottom'vertice inferiore in pixel
Destro = Perimetro.Right'vertice destro in pixel
Sinistro = Perimetro.Left'vertice sinistro in pixel
End Sub

Per annullare la restrizione imposta, si usa la seguente funzione API

Declare Function GetDesktopWindow Lib "user32" () As Long

La funzione GetDesktopWindow restituisce l’handle del desktop che verrà usato dalla funzione GetWindowRect e ClipCursor per impostare come area disponibile l’intero schermo.

Esempio:

Private Sub SbloccaMouse()
Dim Perimetro As RECT
GetWindowRect GetDesktopWindow(), Perimetro
ClipCursor Perimetro
End Sub

se si limita lo spostamento del mouse, tale restrizione avrà effetto su tutto il sistema non solo nel programma che si sta usando. Quindi è  indispensabile prevedere sempre un’opportuna routine che annulli, in ogni caso questa  limitazione.

Identificare la finestra che si trova sotto al mouse
Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (lpPoint As POINTAPI) As Long

Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long

Utilizzando la seguente variabile del tipo POINTAPI:

Type POINTAPI
x As Long

y As Long
End Type

La funzione GetCursorPos restituisce, in una variabile di tipo definito dall’utente denominata POINTAPI, le coordinate x,y della posizione del mouse, relative all’angolo superiore sinistro dello schermo.
La funzione WindowFromPoint restituisce l’handle (hWnd) della finestra che si trova in corrispondenza delle coordinate x,y specificate nell’argomento usato per la chiamata.

Esempio

Function WindowHandle() As Long
Dim Pos As POINTAPI
GetCursorPos Pos 'restituisce la posizione x,y del cursore del mouse (in pixel)
WindowHandle = WindowFromPoint(Pos.x, Pos.y) 'restituisce l’handle della finestra che si trova in corrispondenza di: Pos.x, Pos.y
End Function

La funzione WindowHandle restituirà l’handle (hWnd) di qualunque finestra (anche se questa non appartiene alla propria applicazione) che si trova sotto al cursore del mouse.

Il seguente codice di esempio, permette di ricavare tutti gli handle degli oggetti presenti nel vostro desktop:

Private Sub Timer1_Timer() 'proprietà interval = 100
Label1. Caption = WindowHandle 'visualizza l’handle dell’oggetto sopra a cui si trova il cursore del mouse
End Sub

Function WindowHandle() As Long
Dim Pos As POINTAPI
GetCursorPos Pos 'restituisce la posizione x,y del cursore del mouse (in pixel)

WindowHandle = WindowFromPoint(Pos.x, Pos.y)
End Function

la funzione, GetCursorPos , restituisce la posizione del mouse con valori espressi in pixel. Per convertire tali valori in Twip usare le seguenti istruzioni:
PuntoX = Pos.x * Screen.TwipsPerPixelX’
PuntoY = Pos.y * Screen.TwipsPerPixelY
Impostare un nuovo valore di tempo per il doppio clic del mouse
Function SetDoubleClickTime Lib "user32" (ByVal wCount As Long) As Long

La funzione SetDoubleClickTime permette di impostare l’intervallo del valore di doppio clic del mouse.

Esempio

Function DoubleClickNewTime(wCount as Long)

SetDoubleClickTime wCount
End Function

Richiamare la funzione DoubleClickNewTime passando come argomento, wCount, il valore, espresso in millisecondi, del tempo che si vuole impostare per l’intervallo del doppio clic.

Call DoubleClickNewTime(2000)

Nota. Questa modifica del doppio clic ha effetto su tutto il sistema.
Invertire i pulsanti del mouse
Declare Function SwapMouseButton Lib "user32" (ByVal bSwap As Long) As Long

Function InvertiPulsanti(bSwap As Boolean)
SwapMouseButton bSwap
End Function

InvertiPulsanti(True) : per invertire .
InvertiPulsanti(False) : per ripristinare.
 

Verificare la presenza del mouse

Per verificare la presenza del mouse è necessario usare la seguente dichiarazione API:

Declare Function GetSystemMetrics Lib "user32" Alias "GetSystemMetrics" (ByVal nIndex As Long) As Long

con la seguente costante:

Const SM_MOUSEPRESENT = 19


La funzione GetSystemMetrics restituisce (in base all’indice usato nella chiamata) informazioni sul sistema e sulla sua configurazione. Utilizzandola, come in questo caso, per determinare la presenza del mouse, è necessario richiamarla impostando come indice (nIndex) la costante SM_MOUSEPRESENT.

L’esempio di codice seguente, mostra come richiamare la funzione:

Function MouseInstallato() As Boolean

MouseInstallato = GetSystemMetrics(SM_MOUSEPRESENT) = 1
End Function

La funzione, MouseInstallato, restituirà True (vero) se il mouse è installato, oppure False (falso), se non ci sono mouse installati nel sistema.