Come fermare l'evento MouseMove

di il
23 risposte

Come fermare l'evento MouseMove

Buona sera a tutti

premetto che cerco aiuto per vb.net linguaggio visualbasic e non sono sicuro se sto postando nel posto giusto.

Ho un problema con l'evento me.mousemove, provo a spiegarmi: con il codice sotto prelevo la posizione del mouse al momento del tick ti un timer, ma vorrei terminare l'evento per riprenderlo al tick successivo.

    Private Sub TimerHome_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerHome.Tick
       AddHandler Me.MouseMove, Sub(s As Object, ev As MouseEventArgs)
                                    NewPositionMouse = MousePosition
                                    Label1.Text = NewPositionMouse .ToString
                                End Sub
       LastPositionMouse = NewPositionMouse 
       RemoveHandler Me.MouseMove, AddressOf TimerHome_Tick
   End Sub

Dove sbaglio?

Grazie in anticipo

23 Risposte

  • Re: Come fermare l'evento MouseMove

    Ciao, mi sembra che stai aggiungendo (accumulando) "AddHandler" e non riesci a rimuoverli...  mi sa che devi rivedere "RemoveHandler"

  • Re: Come fermare l'evento MouseMove

    30/01/2025 - Orangine ha scritto:

    Buona sera a tutti

    premetto che cerco aiuto per vb.net linguaggio visualbasic e non sono sicuro se sto postando nel posto giusto.

    Ho un problema con l'evento me.mousemove, provo a spiegarmi: con il codice sotto prelevo la posizione del mouse al momento del tick ti un timer, ma vorrei terminare l'evento per riprenderlo al tick successivo.

        Private Sub TimerHome_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TimerHome.Tick
           AddHandler Me.MouseMove, Sub(s As Object, ev As MouseEventArgs)
                                        NewPositionMouse = MousePosition
                                        Label1.Text = NewPositionMouse .ToString
                                    End Sub
           LastPositionMouse = NewPositionMouse 
           RemoveHandler Me.MouseMove, AddressOf TimerHome_Tick
       End Sub

    Dove sbaglio?

    Grazie in anticipo

    Mousemove si scatena quando il puntatore passa sopra l'oggetto che ha l'evento mousemove.

    Se vuoi fare un dragdrop usi dragdrop. Se vuoi dare la posizione iniziale e spostare l'oggetto nella posizione finale usi mousedown per attivare la posizione iniziale e mouse up per il punto di rilascio e chiamando l'evento dragdrop. Ovviamente dai una variabile logica per bypassare dragdrop se non serve.

  • Re: Come fermare l'evento MouseMove

    Non si capisce bene cosa vuoi ottenere. Forse vuoi semplicemente mostrare in una label la posizione del mouse ad ogni tick del timer?

    Forse è meglio se spieghi qual è il tuo obbiettivo in pratica, perché detta così - "fermare l'evento MouseMove" - non ha molto senso.

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - grumpy ha scritto:

    Non si capisce bene cosa vuoi ottenere. Forse vuoi semplicemente mostrare in una label la posizione del mouse ad ogni tick del timer?

    Forse è meglio se spieghi qual è il tuo obbiettivo in pratica, perché detta così - "fermare l'evento MouseMove" - non ha molto senso.

    Buongiorno, quello che voglio ottenere è la posizione del mouse ad ogni tick del timer ma solo se la posizione del mouse è all'interno del form.

    Questo per verificare se la form e solo aperta, magari su un secondo schermo, ma l'utente sta facendo altro, per esempio navigare sul web.

    Mi è venuto in mente di rilevare la posizione del mouse all'interno del form che, confrontata con la posizione precedente, può fare capire se l'app è utilizzata.

    Si accettano consigli alternativi in merito, grazie.

  • Re: Come fermare l'evento MouseMove

    30/01/2025 - Orangine ha scritto:

    Dove sbaglio?

    Ciao, Non hai controllato e corretto quanto ti avevo suggerito?

    30/01/2025 - By65Franco ha scritto:

    Ciao, mi sembra che stai aggiungendo (accumulando) "AddHandler" e non riesci a rimuoverli...  mi sa che devi rivedere "RemoveHandler"

    Per Esempio:

    Come prima cosa potresti dividere i processi.

    Poi per sicurezza potresti rimuovere prima di aggiungere l'handler

    Puoi per esempio scrivere i metodi in questo modo che risulta un pò più leggibile:

        ' TICK TIME
        Private Sub TimerHome_Tick(sender As Object, e As EventArgs) Handles TimerHome.Tick
            ' remove handler mouse
            RemoveHandler Me.MouseMove, AddressOf MouseMoveHandler
            ' add handler mouse
            AddHandler Me.MouseMove, AddressOf MouseMoveHandler
        End Sub
    
        ' MOUSE MOVE HANDLER
        Private Sub MouseMoveHandler(ByVal sender As Object, ByVal e As MouseEventArgs)
            ' retrieve new coordinates mouse and display
            NewPositionMouse = MousePosition
            Me.LabelMousePosition.Text = NewPositionMouse.ToString()
            ' save last coordinates mouse
            LastPositionMouse = NewPositionMouse
        End Sub
    

    e se per esempio in form load avvii il timer:

        ' FORM LOAD
        Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' set timer and start
            TimerHome.Interval = 1000
            TimerHome.Start()
        End Sub
    

    ottieni una cosa di questo tipo:

    In questo esempio si registra lo spostamento del mouse ad ogni Secondo con l'impostazione "TimerHome.Interval = 1000"

    Non so se corrisponde esattamente al tuo scopo e/o alla tua richiesta, ma l'esempio può aiutarti a capire come poter interagire tra questi due eventi con il metodo che hai postato.

    Prova ad approfondire e vedi te cosa e come fare... ;-)

    .

    [Edit]

    Dimenticavo un osservazione... se vuoi tracciare solo il movimento del mouse allora non hai bisogno del Timer e la soluzione ottimale sarebbe quella di aggiungere l'handler una sola volta, per esempio in form load. In questo modo il sistema risulta più efficiente e ne beneficia la memoria.
    Per esempio

     	' FORM LOAD
        Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            ' set handler
            AddHandler Me.MouseMove, AddressOf MouseMoveHandler
        End Sub 
  • Re: Come fermare l'evento MouseMove

    Grazie By65Franco per la celere risposta ed i suggerimenti, ma purtroppo non ho risolto.

    Siccome dal form principale, che rimane sempre aperto, si possono aprire ulteriori form per cui dovrei aggiungere per ognuno il rilevamento della posizione del mouse. 

    Il rilevamento all'apertura del form e/o all'avio del timer lo avevo già fatto e funzionava senza però più fermarsi come hai mostrato nel tuo ultimo esempio. Penso che avere il rilevamento sempre attivo comporti un sovraccarico di memoria, questo il motivo del timer per rilevarne la posizione solo in un determinato momento.

    Grazie.

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - Orangine ha scritto:

    Grazie By65Franco per la celere risposta ed i suggerimenti, ma purtroppo non ho risolto.

    Siccome dal form principale, che rimane sempre aperto, si possono aprire ulteriori form per cui dovrei aggiungere per ognuno il rilevamento della posizione del mouse. 

    Il rilevamento all'apertura del form e/o all'avio del timer lo avevo già fatto e funzionava senza però più fermarsi come hai mostrato nel tuo ultimo esempio. Penso che avere il rilevamento sempre attivo comporti un sovraccarico di memoria, questo il motivo del timer per rilevarne la posizione solo in un determinato momento.

    Grazie.

    Immaginavo... Posso chiederti lo scopo e/o l'uso di questo tipo di approccio ? ... sono curioso di capire  ;-)

  • Re: Come fermare l'evento MouseMove

    Praticamente vorrei che l'applicazione si chiudesse dopo un determinato tempo di inattività.

    Probabilmente non sto seguendo la strada corretta.......

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - Orangine ha scritto:

    Siccome dal form principale, che rimane sempre aperto, si possono aprire ulteriori form per cui dovrei aggiungere per ognuno il rilevamento della posizione del mouse. 

    Per esempio se la form chiamante apre una seconda form e vuoi chiudere l'handler della form chiamante, potresti semplicemente tener traccia dello stato dell'handler, rimuoverlo all'apertura della nuova form e riaprirlo quando chiudi la form chiamata.

    Non usare il timere un esempio potrebbe essere molto banalmente 
    Definisci un booleano per gestire lo stato dell'handler

    
    ' define property value
    Private Property NewPositionMouse As Point
    Private Property LastPositionMouse As Point
    Private MouseHandlerEnabled As Boolean = False
    
    ' FORM LOAD
    Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    	' add handler 
    	AddHandler Me.MouseMove, AddressOf MouseMoveHandler
        ' set status handler
    	MouseHandlerEnabled = True
    End Sub
    
    ' MOUSE MOVE HANDLER
    Private Sub MouseMoveHandler(ByVal sender As Object, ByVal e As MouseEventArgs)
       ' retrieve new coordinates mouse and display
        NewPositionMouse = MousePosition
        Me.LabelMousePosition.Text = NewPositionMouse.ToString()
        ' save last coordinates mouse
        LastPositionMouse = NewPositionMouse
    End Sub
    
    ' QUANDO APRI LA NUOVA FORM E LO STATO DELL'HANDLER = TRUE ALLORA LO RIMUOVI E LO RIAGGIUNGI QUANDO RITORNI DALLA FORM CHIAMATA
    
    Private Sub ButtonOpenNewForm_Click(sender As Object, e As EventArgs) Handles ButtonOpenNewForm.Click
    	' remove handler
    	If MouseHandlerEnabled Then
        	RemoveHandler Me.MouseMove, AddressOf MouseMoveHandler
        	MouseHandlerEnabled = False
    	End If
    
    	' open new foem
    	Dim newForm As New FormNew()
    	newForm.ShowDialog()
    
    	' add handler
    	If Not MouseHandlerEnabled Then
        	AddHandler Me.MouseMove, AddressOf MouseMoveHandler
        	MouseHandlerEnabled = True
    	End If
    End Sub

    Più o meno una cosa di questo tipo ... non so se fa al caso tuo.

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - Orangine ha scritto:

    Praticamente vorrei che l'applicazione si chiudesse dopo un determinato tempo di inattività.

    Probabilmente non sto seguendo la strada corretta.......

    Penso di  non averti capito bene ... se puoi dare ulteriori dettagli possiamo valutare se è la strada giusta oppure no.

  • Re: Come fermare l'evento MouseMove

    Le info si devono tirare fuori con le pinze...

    On mousemove o on focus: timer off

    On hide: timer on

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - sihsandrea ha scritto:

    Le info si devono tirare fuori con le pinze...

    On mousemove o on focus: timer off

    On hide: timer on

    ;-)) mi sembra di vederlo seduto nella poltrona del dentista e noi nel cercare di operarlo ;-))

    Ma a parte le battute, ...semplicemente :

    30/01/2025 - sihsandrea ha scritto:

    Mousemove si scatena quando il puntatore passa sopra l'oggetto che ha l'evento mousemove.

    Se vuoi fare un dragdrop usi dragdrop. Se vuoi dare la posizione iniziale e spostare l'oggetto nella posizione finale usi mousedown per attivare la posizione iniziale e mouse up per il punto di rilascio e chiamando l'evento dragdrop. Ovviamente dai una variabile logica per bypassare dragdrop se non serve

    Vediamo se fornisce una piccola analisi per mettere meglio a fuoco.

  • Re: Come fermare l'evento MouseMove

    Provo a spiegarmi meglio:

    Lo scopo è quello di sapere se l'utente utilizza l'app che ho fatto oppure se l'ha avviata solamente ma poi fa altro, per esempio naviga su internet  per ore.

    Per fare ciò ho pensato ad un timer che confronta due variabili, una con le coordinate del mouse al tick precedente ed una con quelle rilevate allo scadere del timer.

    Se rilevo la posizione al di fuori di me.mousemove le variabili verranno sempre aggiornate anche se nella form non è stato fatto alcun movimento.

    Se lego il rilevamento al me.mousemove questo continua ininterrottamente assegnando correttamente il valore alle variabili solo al tick, ma il mio dubbio/problema è che, dovendo fare la stessa operazione per ogni form figlio utilizzato, rischio di appesantire la memoria utilizzata dalla mia app, da qui la richiesta di sapere se è possibile interrompere me.mousemove tra un tick e l'altro.

    Spero di essere riuscito a spiegarmi e vi ringrazio per l'aiuto e l'interessamento.

  • Re: Come fermare l'evento MouseMove

    31/01/2025 - Orangine ha scritto:

    Lo scopo è quello di sapere se l'utente utilizza l'app che ho fatto oppure se l'ha avviata solamente ma poi fa altro,

    Potresti utilizzare con il timer (ad intervalli di enne secondi o minuti) e con le funzioni:
    GetForegroundWindow e GetActiveWindow

    se l'App è aperta ma non usata oppure se è  aperta e l'utente si trova su altre applicazioni

    https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-getforegroundwindow

    https://learn.microsoft.com/it-it/windows/win32/api/winuser/nf-winuser-getactivewindow

Devi accedere o registrarti per scrivere nel forum
23 risposte