ctrl+c auf curserpos geht manchmal nicht

02/16/2019 20:46 FerroKarr#1
Vielleicht hat einer einen Rat....

Es geht um ein Spiel das im Inventarraster (5*12) Items liegen hat.
Das Spiel selber sieht vor, das die Itemdaten mit Ctrl+C in die Zwischenablage kopierbar ist.

Nun wollte ich eine Routine haben die "mal eben" die 60 Positionen abgeht, die Daten ausliest und das Ergebnis in eine Textbox packt.

Das setzten der CursorPos geht ohne Probleme. Allerdings "verschluckt irgendwer das ganze Zwischenablage gebastelte. In der Ausgabe fehlen die Informationen von manchen Positionen. Leider immer unterschiedlich. Manchmal stimmts. Meist aber nicht. Ich habe die Vermutung das es ein timing Problem, mit dem "Cursor Positionswechsel" dann "in die Zwischenablage reinschreiben" dann "Zwischenablage in eine Variable schreiben", gibt.

Ich hab schon diverse Dinge ausprobiert, komme aber einfach nicht weiter.
Vielleicht hat irgendjemand einen Tip?
Hier mal der roh Code:



[
Code:
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim ClipText As String
        Dim ClipSplit(61) As String
        SetForegroundWindow(HWND)
        Dim i As Integer = 0
        Dim k As Integer = 0
        For i = 0 To 11
            For k = 1 To 5
                ClipText = ""
                SetCursorPos(InvX + ((i + 1) * StepX) - (StepX / 2), InvY + (k * StepY) - (StepY / 2))
                SendKeys.Send("^c")
                ClipText = Clipboard.GetText()
                If ClipText <> "" Then
                    ClipSplit = Clipboard.GetText().Split(vbCrLf)
                    TextBox62.Text = TextBox62.Text & vbCrLf & (k + (i * 5)).ToString & "- " & ClipSplit(1).Replace(vbLf, "") & " - " & Trim(ClipSplit(3).Replace(vbLf, ""))
                    If Clipboard.ContainsText Then Clipboard.Clear()
                    Do While Clipboard.ContainsText
                    Loop
                End If
            Next k
        Next i
    End Sub

Vielleicht mal als Anschauungsobjekte:

Das Inventar:
[Only registered and activated users can see links. Click Here To Register...]

und "ein" Ergebnis:
[Only registered and activated users can see links. Click Here To Register...]

Danke schonmal ...
Ferro
02/17/2019 00:35 ComputerBaer#2
Ich würde vermuten, dass du einfach zu schnell bist. Dein Programm schafft die 60 Felder vermutlich locker innerhalb einer Sekunde, das Spiel aber wahrscheinlich nur ein Feld pro Frame. Ein Timing Problem in deinem Programm selbst ist eigentlich unmöglich, immerhin machst du alles nacheinander und nicht parallel.

Das Spiel wird sehr wahrscheinlich nur jeden Frame die Cursor Position und Tastatureingaben abfragen und dementsprechend auch nur jeden Frame in der Lage sein dir die richtigen Daten in die Zwischenablage zu geben. Wenn dein Programm jetzt also 2-3 Felder in der Zeit bearbeitet, in der das Spiel nur einen Frame schafft, kannst du auch nur die Daten von einem der Felder bekommen.

Also Lösung für das Problem sollte es also ausreichen, wenn du dein Programm mit Thread.Sleep(x) oder einer eleganteren Lösung so ausbremst, dass du nur noch ein Feld pro Frame triffst.
02/19/2019 13:51 FerroKarr#3
Jap... genau das war auch mein Gedanke.
Hab es nun mit zwei "delays" gelöst.
Einer nachdem der Cursor "positioniert" wurde und
einer nach CtrlC.
Ich hatte festgestellt das auch Windows da, je nach Rechnerleistung (VM), etwas Zeit braucht :)
Für die die es interessiert..

Schneller PC:
Delay nach Cursor -> 35 ms
Delay nach CtrlC -> 10 ms

VM 2Core/8GB:
Delay nach Cursor -> 110 ms
Delay nach CtrlC -> 80 ms

Um das ganze nun variabler zu machen kann man die Delayzeit nun über zwei "Trackbars" selber einstellen ^^.