(Keybinder) Exit Sub funktioniert nicht

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Niko Ortner.

    (Keybinder) Exit Sub funktioniert nicht

    Hallo,

    Ich baue gerade an einem Keybinder alles funktioniert außer einer Stopp Funktion.
    So sieht es bis jetzt aus(Nur Teil Ausschnitte):
    Case 8 ist die Taste 8.
    Irgend ein Text wird gesagt:

    VB.NET-Quellcode

    1. Case 8
    2. SendKeys.Send("{T}")
    3. SendKeys.Send("»Willkommen«")
    4. SendKeys.Send("{ENTER}")

    Es ist aber mehr Text was gesagt wird, diesen will ich dann mit der Taste 9 vorläufig beenden können.
    So sieht es bis jetzt aus:

    VB.NET-Quellcode

    1. Case 9
    2. SendKeys.Send("{T}")
    3. SendKeys.Send("»»Abbruch««")
    4. SendKeys.Send("{ENTER}")
    5. Exit Sub

    Es ist alles in einem Protected Overrides Sub verpackt.
    Doch es funktioniert nicht.

    Grüße GMTechnologie
    Nicht die Komplettem Cases ist es nicht. Zu viele Zeichen.
    Achtet nicht auf die Texte :D
    Da müsst ihr euch jetzt durch die Texte quälen.
    Spoiler anzeigen

    Protected Overrides Sub WndProc(ByRef m As Message)
    'die messages auswerten
    Dim stopw As New Stopwatch
    Dim sleeptime As Integer = 3500
    If m.Msg = WM_HOTKEY Then
    'hier wird entschieden welcher hotkey es war
    'einfach die übergebene id auswerten
    Select Case m.WParam
    ' Hier sind die anderen Case´s da sonst zu viele Zeichen
    Case 4
    SendKeys.Send("{T}")
    SendKeys.Send("»Flugschein-Zusatz«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("»Steuerung:«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Das Flugzeug beschleunigen sie mit W und bremsen mit S")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Sie drehen es mit Pfeiltaste Rechts oder D rechtsherum")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("und mit Pfeiltaste LInks oder A linksherum")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Sie schwenken Ihr Flugzeug mit Q und E nach links und rechts.")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Mit Pfeiltaste Oben ziehen Sie Ihren Flieger runter, mit Pfeiltaste Unten hoch.")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    Case 5
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen bei der LKW Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("»Sie müssen sich immer an folgende Regeln halten:«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()

    SendKeys.Send("{T}")
    SendKeys.Send("1. Die Ampeln dürfen Sie in allen Städten missachten es gilt Rechts vor Links")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("2. Das Geschwindigkeitslimit liegt in LS und SF bei 85 km/h")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("3. Sie müssen die STVO einhalten, Rechts vor Links beachten und vorsichtig fahren.")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("4. Sie dürfen nach Alkohol- oder Drogenkonsum nicht mehr fahren, sonst droht Führerscheinentzug")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("»Zusätzliche Informationen«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("»Mit einem LKW können Sie Benzin an Tankstellen liefern oder Waren am Hafen abholen.«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Mit einem kleinen Laster können Sie Prods an BIZs ausliefern.")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("»Prüfung:«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Sie müssen mir jetzt folgen, ich werde Ihre Reaktion mit Bremstests testen.")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Wenn sie micht mehr als 2x rammen, überholen oder mich mehr als 1x aus den Augen verlieren, sind sie durchgefallen!")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    SendKeys.Send("{T}")
    SendKeys.Send("Wenn sie die Regeln gelesen haben und bereit sind oder fragen haben, sagen Sir mir bescheid!.")
    SendKeys.Send("{ENTER}")
    Case 6
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen zur Flugzeug Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    Case 7
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen zur Flugzeug Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    Case 8
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen zur Flugzeug Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    Case 9
    SendKeys.Send("{T}")
    SendKeys.Send("»»Abbruch««")
    SendKeys.Send("{ENTER}")
    Exit Sub
    Case 10
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen zur Flugzeug Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()
    Case 11
    SendKeys.Send("{T}")
    SendKeys.Send("»Willkommen zur Flugzeug Prüfung«")
    SendKeys.Send("{ENTER}")
    stopw.Start()
    Do Until stopw.ElapsedMilliseconds >= sleeptime
    Application.DoEvents()
    Loop
    stopw.Stop()
    stopw.Reset()

    End Select
    End If
    MyBase.WndProc(m)
    End Sub
    Zu viel C&P. :S
    Setze einen Haltepunkt an den Beginn des Case-Zweiges und steppe durch.
    Verfolge, was das Programm macht und vergleiche dies mit dem, was es tun soll.
    Und schwups hast Du den Fehler gefunden.
    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!
    Hi, dachte schon es wäre die Rettung war es aber nicht.
    :)
    Noch welche Ideen?
    Ein ganz ganz ganz unsaubere Methode wäre Das Programm beenden lassen und wieder starten lassen. Aber dies würde ich nur im äußersten Notfall machen wollen.

    Grüße GMTechnologie
    @rotherford:
    Ich glaube Du verstehst das falsch.
    Er hat SendKeys.Send() aufgerufen, und als Argument Massig viel Text übergeben.
    Das Senden der ganzen Zeichen dauert seine Zeit (Das Programm läuft inzwischen weiter, weil SendKeys asyncrhon läuft).
    Jetzt möchte er, falls es ihm zu lange dauert, das Senden der Zeichen unterbrechen.
    Sowas wie SendKeys.Stop() oder so.

    @GMTechnologie:
    Es wäre möglich, nicht alles auf einmal zu senden, sondern das Senden in einen BGW zu verlagern, und z.B. immer nur zeilenweise, oder Blöcke von sagen wir mal 100 Zeichen zu senden.
    Dann kannst Du dem BGW per CancelAsync() sagen, dass er abbrechen soll.
    Pseudocode:

    VB.NET-Quellcode

    1. BGWDoWork:
    2. Dim Remaining As String = DerZuSendendeText
    3. Do Until Remaining = Nothing OrElse BGW.CancellationPending
    4. Dim ThisText As String
    5. If Remaining.Lenght >= 100 Then
    6. ThisText = Remaining.SubString(0, 100)
    7. Remaining = Remaining.SubString(100) 'Ich bin mir mit dem Index hier nicht ganz sicher
    8. Else
    9. ThisText = Remaining
    10. Remaining = Nothing
    11. End If
    12. SendKeys.SendWait(ThisText)
    13. Loop
    14. --------
    15. Cancel:
    16. BGW.CancelAsync()
    17. --------


    Edit: Ach, der BGW hat ja eine Cancel-Methode.

    Edit2: Hab ich vergessen: Damit der BackGroundWorker zwischendrin abbrechen kann, muss er natürlich warten, bis das aktuell gesendete fertig gesendet wurde.
    Darum die SendKeys.SendWait() Methode verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Niko Ortner“ ()