Auslesen eines Visible Text aus einem nicht editierbaren Feld

  • Hallo,
    Ich bin neu was Autoit angeht. Hab früher schon viel darüber gelesen und es im Hinterkopf immer als interessant behalten, da es viele Möglichkeiten bietet eine Art Schnittstelle oder Funktionserweiterungen für bestehende Programme zu schreiben. Doch bis Dato brauchte ich es noch nie. Tja, nun sitze ich seit dem Wochenende hier und scheitere trotz etlichen Recherchen an einer einfachen Abfrage.
    Wahrscheinlich können die erfahreneren Benutzer hier im Forum mir vielleicht eher helfen und wie man dies abfragt.
    Ich möchte aus einem Video Schnittprogramm (Virtualdub) die Frame Position im Video auslesen.
    Das Autoit Info Fenster gibt mir dazu folgende Angaben, wenn ich mit dem Fensterfinder auf dieses Anzeigeelement unten in Virtualdub ziehe.

    Window
    ---------
    Title: VirtualDub 1.10.3 - [Trailer]
    Class: VirtualDub
    Handle: 0x003C127C

    Control
    ---------
    Class: Edit
    Instance: 1
    ClassnameNN: Edit1
    Advanced Mode: [CLASS:EDIT; INSTANCE:1]
    ID: 501
    Handle: 0x005611BE

    Visible Text
    --------------
    Frame 82 (0:00:03.280) [K]

    Diesen letzten Text will ich haben und automatisch in die Windowszwischenablage verfrachten.
    Befehle wie Getline oder Controlgettext bringen mir immer nur 0 oder nichts.
    Versucht hab ich es schon wie folgt.

    WinWait("VirtualDub 1.10.3")
    $a = ControlCommand("[CLASS:Edit; INSTANCE:1]", "", "501", "GetLine", "1")
    $a = ControlCommand("[CLASS:VirtualDub]", "", "Edit1", "GetLine", "1")
    $x = ControlGetText("[CLASS:Edit; INSTANCE:1]", "", 501)

    Hätte jemand vielleicht etwas Zeit, sich dessen kurz anzunehmen.
    Scheinbar spreche ich entweder das Feld falsch an oder ich interpretiere die Infodaten bzgl. ID usw. nicht richtig.

    Danke im voraus.

  • Ich denke du bist nah dran ;)
    So wie ich das sehe setzt du nur die Parameter der Controlcommands falsch.
    Parameter Nr. 1 ist der Fenstertitel.
    Probier doch mal:

    [autoit]

    WinWait("VirtualDub 1.10.3")
    $x = ControlGetText("VirtualDub 1.10.3", "", "[CLASS:Edit; INSTANCE:1]")
    MsgBox(0,"",$x)

    [/autoit]
  • Ja, ich hab es mir schon fast gedacht. Doch da dort ControlID in der Autoit Hilfe steht, bin ich davon ausgegangen, daß man dies wohl direkt mit der Nummer ansprechen könnte.
    da aber schon
    $a = ControlCommand("VirtualDub 1.10.3", "", "501", "GetLine", "1")
    $a = ControlCommand("VirtualDub 1.10.3", "", "Edit1", "GetLine", "1")
    keine Erfolg brachte hab ich [CLASS:Edit; INSTANCE:1] für 501 dummerweise erst gar nicht mehr dort versucht. Manchmal ist so einfach, wenn man die Werte richtig zu deuten weiß.
    Danke, die Lösung mit ControlGetText funktioniert wie von mir erhofft.
    und der Datenaustausch des Inhalts über die Zwischenablage geht auch.
    Damit hab ich dann fast schon die gewünschte Schnittstelle. Da hätte ich mich wohl noch lange gefragt, warum es nicht geht.
    Nah dran ist halt trotzdem daneben. Danke noch mal.

  • Das Auslesen des Texts funktioniert für den vorherigen Text fehlerfrei. Nun wollte ich aber in ein anderes Feld eine Zahl übergeben.

    Die Funktion hab ich erstmal mit
    ControlSetText("VirtualDub 1.10.3", "", "[CLASS:Edit; INSTANCE:1]", "1000")
    an dem obigen Infofeld getestet und der Text wird dort auch geändert. Ist zwar sinnlos, weil dies nur zur Ergebnisanzeige gedacht ist und nicht, um einen Befehl zu übergeben und auch keine Eingaben zu läßt. Das eigentlich Ziel ist ein Unterfenster, daß ich wie folgt ansprechen wollte.
    ControlSetText("Jump To Frame", "", "[CLASS:Edit; INSTANCE:1]", "1000")

    Leider klappt jedoch die Übergabe beim eigentlichen Feld so gar nicht. Mit STRG + G kann man dies separate Fenster erst in VDub öffnen, wo gleich der Wert im Feld makiert ist. Jedoch kann ich dieses Feld nicht mit Autoit ändern. Ich hab auch schon probiert einfach per Send("1235{Enter}") dieses Eingabe Feld anzusprechen. Doch es tut sich nichts.

    Es scheint wohl irgendwie etwas damit zu tun zu haben, daß sich da halt ein separates Fenster öffnet. Denke ich.

    Das Info Tool gibt mir folgende Info zu dem neuen Popup Fenster.
    Window
    ---------
    Title: Jump to frame
    Class: #32770
    Handle: 0x00CF13C6

    Control
    ---------
    Class: Edit
    Instance: 1
    ClassnameNN: Edit1
    Advanced Mode: [CLASS:EDIT; INSTANCE:1]
    ID: 1152
    Handle: 0x009B14A6

    Visible Text
    --------------
    Jump to frame &number:
    Jump to frame at &time:
    0
    0:00.000
    OK
    Cancel

    Wie also schaffe ich es, daß ich die Funktion zu "Jump ... &number" nutzen kann,
    und Befehle wie Send("!n") korrekt im Unterfenster angenommen werden?

    Wäre toll, wenn da noch mal einer von euch eine hilfreichen Hinweis geben kann.
    Danke im voraus.

  • Ja, den Fehler hatte ich auch schon gefunden und schon korrigiert gehabt. Dummerweise aber hier die alte Codezeile mit "To" statt "to" gepostet. Leider funktioniert es auch mit dem korrekten Titel nicht. Das verwirrt mich ja so. Im Hauptfenster kann ich ja scheinbar mit dem Titel Virtualdub 1.10.3 entsprechende Änderungen machen. Jedoch nicht in dem neuen kleinen Fenster, wenn ich dies mit STRG+G geöffnet habe. Das Hauptfenster ist dann auch nicht ansprechbar. Der Focus liegt also schon auf dem neuen. Ist ein wenig merkwürdig. WinWaitActive("Jump to frame") hilft leider auch nicht.

    Nachtrag: Hab den Fehler soeben nun gefunden. Lag nicht ganz an Autoit sondern an der externen GUI, über die ich das compilierte Autoit-Script starten ließ. Ich hatte dies leider den Parameter wait beim Aufruf übergeben. Danke also noch mal.

    Einmal editiert, zuletzt von ATLAN (14. Juni 2013 um 13:45)

  • Nicht nur to sondern auch frame ist klein geschrieben. Keine Ahnung ob das noch dein Fehler war.
    Aber so funktionierts bei mir ;)

    [autoit]


    ControlSend("[CLASS:VirtualDub]", "", "", "^g")
    WinWait("[CLASS:#32770]", "")
    ControlSetText("[CLASS:#32770]", "", "[CLASS:Edit; INSTANCE:1]", "1000")

    [/autoit]

    Hab statt den Fenstertiteln auch CLASS verwendet weil ich ne andere Version hab...

  • Ok, da hat sich gerade deine Antwort mit meinem Nachtrag im vorherigen Beitrag überschnitten . Deine Lösung sieht nur oberflächlich ein wenig anders aus. Das liegt aber daran, daß Du nicht per Titel, sondern wie du schon schreibst, direkt die Klasse ansprichst. Da gibst du mir trotzdem noch einen guten Hinweis, weil ich schon am überlegen war, wie ich später Virtualdub durch neuere Versionen updaten kann, ohne gleich alle Autoit-Scripte neu abändern zu müssen. Das sollte ich auf jeden Fall wohl noch mal antesten. Dank Dir.