Mausbewegung abfragen

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Mausbewegung abfragen

    Hallo VBler,

    ich möchte ein kleines Programm scripten, welches einen Timer besitzt, der nur abläuft, wenn die Maus bewegt wird. Geschieht das nicht, wird der Timer pausiert. Das Programm ließe sich dann z.B. in einem Büro einsetzetn, um die noch verbleibende Arbeitszeit bis Feierabend anzuzeigen.
    Deswegen meine Fragen:
    1. Lässt sich feststellen, ob die Maus aktuell bewegt wird (evtl. durch

    VB.NET-Quellcode

    1. MouseMove
    ?)
    2. Lässt sich ein Timer pausieren, wenn ja, wie?

    Danke im Vorraus
    vbwave :)
    1.)
    - Lies die Koordinaten der Maus aus uns speichere Sie.
    - Warte kurz und wiederhole den Vorang.
    - Wenn die beiden Koordinaten voneinander abweichen hat sich die Maus bewegt.

    2.)
    - Da kannst du sowiso mit einer StopWatch o.ä. arbeiten.
    Hallo, Anhalten lässt sich der Timer. Kommt nur drauf an welchen du Benutzt. Beispielsweise mit folgender Methode:
    msdn.microsoft.com/de-de/libra…ows.forms.timer.stop.aspx

    Das abfangen der Maus-Events wird da schon schwieriger. Da deine Form nicht die ganze Zeit im Vordergrund ist, musst du einen Hook im System registrieren. Ich habe mal mit folgender Library "herum gespielt":
    codeproject.com/Articles/7294/…e-and-Keyboard-Hooks-in-C
    Die brauchst du nur als Verwesi setzen und entsprechend die Events abbonnieren.

    Du musst allerdings noch die Zeit zwischen 2 Maus-Move-Events berechnen, indem du einen Timestamp speicherst und diesen bei der nächsten Bewegung vergleichst. ggf. Stoppst/Startest du deinen Timer. Vielleicht solltst du aber komplett auf den Timer verzichten, und statt dessen die Uhrzeit, oder was auch immer, nur dann aktualisieren, wenn die Maus bewegt wird.
    @vbwave
    Eventuell müsste man hier Boolean und Integer einsetzen...

    Wird Maus bewegt => Cursor wird zur entsprechenden Sektion gelenkt => Neue X bzw. Y Koordinate...

    Ist der Cursor, nach zB. (fiktiver Wert) 11 Integerwerten, auf der selben Stelle im Koordinat...
    So wird Timer1.Enabled = False... und gleichzeitig ein boolearischer Wert auf True gesetzt.

    Beim nächsten Mouse_Move wird eine If-Abfrage durchgeführt.
    Ist der boolearische Wert True, so Timer1.Enabled = True...

    Hab Dir was gebastelt:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim MouseIsMoving As Boolean
    3. Dim Mouse_ As Integer
    4. Dim BufferXYCoordinates As Integer
    5. Dim Did_ As Boolean
    6. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    7. If Mouse_ = 1 Then
    8. MouseIsMoving = False
    9. Else
    10. Mouse_ += 1
    11. End If
    12. If MouseIsMoving = True Then
    13. Label1.Text = "Mouse is moving!"
    14. Else
    15. Label1.Text = "Mouse isn't moving!"
    16. Timer1.Enabled = False
    17. End If
    18. If Not BufferXYCoordinates = System.Windows.Forms.Cursor.Position.X Then
    19. Did_ = False
    20. Else
    21. End If
    22. End Sub
    23. Private Sub Form1_MouseMove(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseMove
    24. If Did_ = True Then
    25. MouseIsMoving = True
    26. Timer1.Enabled = True
    27. Else
    28. Mouse_ = 0
    29. Did_ = True
    30. BufferXYCoordinates = e.Location.X
    31. End If
    32. End Sub
    33. End Class
    ...

    Benötigt wird ein Label und ein Timer, dessen Interval 1 betragen muss ...
    Getestet, funktioniert.

    Ich hoffe Du hast keine böse Absichten...

    Mfg.eniking1998

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „enIking1998“ ()

    @vbwave: Was soll das?
    Zeige in einem Timer-Tick-Event einfach die Dauer an und feddich, das hat nix mit Mausbewegung zu tun.
    Kann es sein, dass Du was ganz anderes vorhast als eine Zeit bzw. eine Dauer anzuzeigen und deswegen auf eine Nutzer-Interaktion lauerst?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habs so gemacht :
    2 Timer, 1 Label

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim MouseKoordnew As String
    3. Dim MouseKoordold As String
    4. Dim Time As Integer
    5. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    6. Timer1.Interval = 100
    7. Timer2.Interval = 100
    8. Timer1.Start()
    9. Timer2.Start()
    10. End Sub
    11. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    12. MouseKoordnew = Windows.Forms.Cursor.Position.ToString
    13. If MouseKoordnew = MouseKoordold Then
    14. Timer1.Stop()
    15. Else
    16. Time += 1
    17. Label1.Text = Time
    18. End If
    19. End Sub
    20. Private Sub Timer2_Tick(sender As System.Object, e As System.EventArgs) Handles Timer2.Tick
    21. MouseKoordold = Windows.Forms.Cursor.Position.ToString
    22. If Not MouseKoordnew = MouseKoordold Then
    23. Timer1.Start()
    24. End If
    25. End Sub
    26. End Class

    enIking1998 schrieb:

    wirklich, 2 Timer?
    Und Du speicherst Location in String ab...
    Nimm doch gleich Integer...


    Ja hätte ich auch nehmen können.
    2 Timer sonst hätten sie bei diesem beispiel immer den gleich wert weil es die Koordinaten ja gleichzeitig entnimmt.

    EDIT :\\ geht nicht mit Integer bei diesem Code :

    VB.NET-Quellcode

    1. MouseKoordnew = Windows.Forms.Cursor.Position.ToString
    Deshalb 2 Booleans...

    Wenn nach 1 nicht bewegt wird, wird zweiter Boolean = True , also wird im MouseMove-Ereignis das erste Boolean auf True gesetzt...
    Und ehm...
    MouseMove ist eine "Schleife", sobald die Cursor die Form bezieht, werden, sei es dieselben, Koordinaten gesendet...
    Probier's mit einer MessageBox...
    Es wird hintereinander aufprompen sobald die Cursor, auf der Form landet...

    Mfg.eniking1998
    Such lieber bei Google nach GetLastInputInfo, bevor Du auch nur daran denkst, den Ranz zu nutzen, der hier gepostet wurde.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    @xd-franky-5 Ja genau, ich dachte an ein Programm, was im Hintergrund läuft. :)

    RodFromGermany schrieb:

    Zeige in einem Timer-Tick-Event einfach die Dauer an und feddich, das hat nix mit Mausbewegung zu tun.
    @RodFromGermany Ich möchte ja nur, dass der Timer abläuft, wenn der User am PC arbeitet, nicht auch, wenn z.B. gerade der Display ausgeschaltet ist, er Rechner ist dann ja trotzdem an und der Timer tickt weiter.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „vbwave“ ()