Timer genauer machen ?

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Timer genauer machen ?

    Hey @ all,

    heute habe ich mal eine etwas schwerere Frage.
    Und zwar ist der unten gepostete Code für ein kleines Programm an welchem ich gerade arbeite.
    Der Sinn bzw. Zweck des Programms ist meinen Mausklick zu erkennen (egal ob ich auf die Form klicke oder auf Word oder irgendwas sonst) und exact nach einem Intervall von 70 (ca. 1 Sekunde und 130 Millisekunden) einen zweiten Klick simuliert.
    Nun zu meinem Problem, eigendlich läuft das Programm schon recht gut. Allerdings kommt der zweite Klick nie exact sonder immer mit einer Toleranz von + - 200 Millisekunden.
    Zum Beispiel :

    1 Sekunde und 130 Millisekunden
    1 Sekunde und 185 Millisekunden
    1 Sekunde und 300 Millisekunden

    Das ganze sollte aber jedes mal exact bei 1 Sekunde und 130 Millisekunden stoppen.
    Was mache ich falsch, ist es überhaupt möglich das ganze für jeden Durchgang exact hinzubekommen ?
    Ist mein Code zu lang ?

    Hier mein Code :



    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim t As New Integer
    3. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    4. t = (t + 1)
    5. End Sub
    6. Private Declare Function GetAsyncKeyState Lib "user32" _
    7. (ByVal vKey As Long) As Integer
    8. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    9. t = 1
    10. Timer2.Start()
    11. End Sub
    12. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    13. Windows.Forms.Cursor.Position = New Point(TextBox1.Text, TextBox2.Text)
    14. SimulateClick()
    15. End Sub
    16. Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
    17. If MouseButtons = Windows.Forms.MouseButtons.Left Then
    18. t = 0
    19. Timer1.Start()
    20. End If
    21. If t = 70 Then
    22. SimulateClick()
    23. Timer1.Stop()
    24. t = 0
    25. End If
    26. End Sub
    27. Public Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer)
    28. Public Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down
    29. Public Const MOUSEEVENTF_LEFTUP = &H4 ' left button up
    30. Public Sub SimulateClick()
    31. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    32. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    33. End Sub
    34. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    35. Timer1.Stop()
    36. Timer2.Stop()
    37. End Sub
    38. Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    39. Timer2.Start()
    40. End Sub
    41. End Class



    Wäre klasse wenn mir jemand helfen könnte.

    MFG Tizi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Tizi93“ ()

    Sorry, ich stell mich grad en bisschen blöd an.
    Ich hab mal in Google geschaut, blicks aber net wie ich Ihn in mein Code einbinden muss. Isch mir zu schwer.Wie gesagt, ich bin noch neu bei VB.net :)
    Könntest du mir vielleicht nochmal helfen ?
    Genaue Timer sind kein triviales Thema. Es wäre erst mal gut, wenn du Dich in die Problematik
    einlesen würdest. So auf die Schnelle wird das nicht gehen. Es gibt einige Seiten im Netz, die
    die Sache etwas erklären. Es kommt halt auch drauf an wie schnell du eine Lösung brauchst.
    Und auch warum du den Mausklick so genau brauchst. Ich hatte mich mal mit MIDI beschäftigt
    unter diesem Thema oder überhaupt Multimedia wirst du auch ein paar Antworten finden.
    Stichwort MidiTimeCode (MTC)

    Ich finde die Links von SystemUnknow sollten schon mal reichen. Versuche jetzt erst mal zu
    verstehen was in diesen Programmen passiert.
    Okay, mach ich .... :)
    Den zweiten Link Lightsource finde ich auch ganz gut :


    VB.NET-Quellcode

    1. '// --> Dieser Code MUSS in ein Modul --> AddressOf funktioniert nur dort
    2. Option ExplicitPrivate Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    3. Private Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongPrivate MtmrID As LongPublic Sub StartTimer(ByVal intMilliSeconds As Integer)
    4. '// --> Timer mit dem Intervall intMilliSeconds starten (Angabe in Millisekunden)
    5. MtmrID = SetTimer(0, 0, intMilliSeconds, AddressOf CallBackTimerProc)
    6. End SubPublic Sub StopTimer()
    7. '// --> Timer stoppen
    8. If MtmrID <> 0 Then
    9. KillTimer 0, MtmrID
    10. End If
    11. End SubPublic Sub CallBackTimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
    12. '// --> Diese Sub wird vom Betriebssystem nach jedem Ablauf des Intervalls aufgerufen
    13. '// --> Hier kannst du dann auf die andere Datei zugreifen etc
    14. End Sub



    Ein bisschen verstehe ich den Code auch. Allerdings sollte ich mein Programm bis heute Abend ca. 6 Uhr fertig haben damit ich es verschicken kann. Kleiner mini Job.
    Könntest du mir vielleicht deswegen, den Code schnell in meinen einbauen ? Wäre wirklich sehr nett von dir.