Newsgroup: it.comp.lang.visual-basic
Titolo: [?] come intercettare il click del mouse furoi dalla form

Salve a tutti.
In questi giorni vi sto sottoponendo a 2-3 domande al giorno ma sto
lavorando ad un progetto un pň complesso.
Ora ve ne pongo un'altra: come da oggetto, č possibile intercettare i
movimenti e i click del mouse fuori dalla form? Sě č vero, potrei capire che
l'utente fa click fuori dalla form dal fatto che questa non ha piů lo stato
attivo, ma metti che mi trovi in un usercontrol. Come fare a capire che la
form che lo contiene ha perso lo stato attivo?
Grazie anticipatamente.
Ciao,
        Salvo

 movimenti e i click del mouse fuori dalla form?
certo : sito comune mousehook credo si chiami !
ecco uno stralcio con le api usate ...
'***************************************************************
' Name: A mouse module, FINALLY!!! Move,click, +more
' Description:This module has the following functions (pretty sel
'     f explanitory): GetX, GetY, LeftClick, LeftDown, LeftUp, RightCli
'     ck, RightUp, RightDown, MiddleClick, MiddleDown, MiddleUp, MoveMo
'     use, SetMousePos
' By: Arthur Chaparyan
'***************************************************************
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)
Public Declare Function SetCursorPos Lib "user32" (ByVal X As Long, ByVal Y
As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As
Long

 certo : sito comune mousehook credo si chiami !
l'ho guardato ma purtroppo non va bene per il mio scopo.
Il mio problema č che nel momento in cui l'utente clicca fuori dal mio
controllo activex devo chiudere un menu a tendina.Piů che i movimenti dovrei
intercettare i click dell'utente e gestirli magari come se fossero eventi.


scusa neee, ma che che tipo di menu' stai usando?
perche' quelli standard si chiudono da soli quando si clicca
fuori dalla loro area.
comunque c'e' sempre la lostfocus dello usercontrol che puoi
usare.
bye
R

 intercettare i click dell'utente e gestirli magari come se fossero eventi.
bha , io so partito da quello e ho creato una funzione che "registra" la
posizione del mouse alla pressione del mouse , e se parliamo dello stesso
esempio , dovresti avere gli eventi del mouse ( leftClick leftDown ecc... )
nel modulo bas !

 usare.
Vorrai dire la exitfocus. perchè la lostfocus avviene solo prima dell'unload
per quello che ho capito.
ExitFocus purtroppo avviene  solo in un caso specifico: l'utente clicca in
un altro controllo della stessa form che contiene il mio controllo ocx.
Gli altri due casi (click sulla form, click fuori dalla form) mi sembra non
provichino alcun evento. Ciò di cui avrei bisogna sarebbe, ad esempio, una
ocx che al click del mouse in qualunque parte dello schermo provochi un
evento fornendomi le coordinate del mouse.

 nel modulo bas !
Lo osserverò con più attenzione poi ti farò sapere.

 un altro controllo della stessa form che contiene il mio controllo ocx.
questo e' esatto (portroppo).
allora devi usare queste API:
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
HTH
bye
R

 Private Declare Function ReleaseCapture Lib "user32" () As Long
forse mi hai dato la risposta al mio post di poco fa .. vediamo che dice la
guida...

 Lo osserverò con più attenzione poi ti farò sapere.
lascia perdere , ho trovato su allapi una funzione che fa al nostro caso !
incolla questo in un form vuoto e clikka dove ti pare ^_- :
Private Type POINTAPI
    X As Long
    Y As Long
End Type
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As
Long
Dim Pt As POINTAPI
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: 
http://www.allapi.net/
    'E-Mail: KPD...@Allapi.net
    'redirect all mouse input to this form
    SetCapture Me.hwnd
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single,
Y As Single)
    ReleaseCapture
    SetCapture Me.hwnd
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y
As Single)
    ReleaseCapture
    SetCapture Me.hwnd
   GetCursorPos Pt
    Me.CurrentX = 0
    Me.CurrentY = 0
    'Clear the screen
    Me.Cls
    Me.Print "Cursor position:"
    'Print the mouse coördinates to the form
    Me.Print "X:" + Str$(Pt.X) + " Y:" + Str$(Pt.Y)
    Me.Print " (Press ALT-F4 to unload this form)"
    SetCapture Me.hwnd
End Sub

 guida...
infatti me la hai data ^_- Riscrivo il progetto con queste nuove info ,
grazie

"Gigio2K" <barone.fab...@M.libero.it.invalid> ha scritto nel
messaggio news:R%P59.59886$lu5.1...@twister1.libero.it...

Perfetto! Stavo proprio visitando allapi alla ricerca di questo codice
quando ho letto il tuo messaggio!
Grazie.
Ciao


[cut]
 ho sfruttato il tuo codice per renderlo adatto al mio scopo ma non va
perchè rimanda tutti gli input del mouse sempre e solo alla mia form non
permettendo l'input del mouse agli altri form e alle altre applicazioni. Non
so proprio come ovviare al problema. Forse conoscendo l'handle del form a
cui effettivamente era inviato l'input del mouse potrei reindirizzarlo.
Ecco il codice:
Private Declare Function SetCapture Lib "User32" (ByVal hwnd As Long) As
Long
Private Declare Function ReleaseCapture Lib "User32" () As Long
Dim MouseDentro As Boolean
Private Sub Form_Load()
    SetCapture Me.hwnd
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
If (X <= Form1.ScaleWidth And X >= 0) And (Y <= Form1.ScaleHeight And Y >=
0) Then
    MouseDentro = True
Else
    MouseDentro = False
End If
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y
As Single)
    ReleaseCapture
    If MouseDentro = False Then
        MsgBox "Click fuori dalla form!"
    End If
    SetCapture Me.hwnd
End Sub

 so proprio come ovviare al problema.
quindi se ho capito :
clikki su un icona , il form registra il click ma l'icona non riceve il
click giusto ?
allora ragionaci un po su del tipo :
io clicco , catturo ,  e poi ? e poi potresti togliere temporaneamente la
registrazione e clikkare tu da programma ^_-
If clicksinistro then
 releasecapture
 ' eseguo quello che voglio a registrazione in pausa ...
 ' e alla fine ci schiaffi un bel
setmousepos(curX,curY)
 leftclick()  ' o altri click
setcapure me.hwnd 'riprendi a registrare fino al prossimo click


ma da dove le hai prese queste funzioni?
Su msdn non si trovano e non sono nemmeno sull'api text viewer.

 Su msdn non si trovano e non sono nemmeno sull'api text viewer.
sono le funzioni implementate nel modulo mouse ... umm ho capito , poi se
ritrovo gli originali te li mando


Aspetta, sono riuscito a risolvere il problema del click ma non quello del
movimento del mouse. Il puntatore rimane infatti pressocchè sempre nella
stessa posizione (si muove massime di due o tre pixel).
Oltre le api SetCapture e ReleaseCapture uso anche mouse_event.
Ecco il codice:
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As
Long
Private Declare Function ReleaseCapture Lib "user32" () As Long
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)
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 Sub Form_Load()
    SetCapture Me.hwnd
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single,
Y As Single)
    'questa routine non funziona
    'per testare il resto del codice metterla in commento
    ReleaseCapture
    mouse_event MOUSEEVENTF_MOVE Or MOUSEEVENTF_ABSOLUTE, X + Me.Left, Y +
Me.Top, 0, 0
    DoEvents
    SetCapture Me.hwnd
End Sub
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y
As Single)
    ReleaseCapture
    If Not ((X <= Form1.ScaleWidth And X >= 0) And (Y <= Form1.ScaleHeight
And Y >= 0)) Then
        'fai quello che ti pare
    End If
    mouse_event MOUSEEVENTF_LEFTDOWN Or MOUSEEVENTF_ABSOLUTE Or
MOUSEEVENTF_MOVE, X + Me.Left, Y + Me.Top, 0, 0
    DoEvents
    mouse_event MOUSEEVENTF_LEFTUP, X + Me.Left, Y + Me.Top, 0, 0
    DoEvents
    SetCapture Me.hwnd
End Sub