Wechselnde ControlID und Instanz

  • Hallo,

    ich bin neu hier und hoffe es kann mir jemand helfen. Auch nach langen Googeln bin ich leider nicht weiter gekommen.

    Hier mein Problem:
    Ich möchte ein Programm steuern, bei dem ich ein Edit Feld beschreibe, dann muss ich zwei Buttons betätigen.
    Das funktioniert soweit ganz gut und war auch nicht schwer.
    ABER
    Jenachdem in welcher Reihenfolge ich die Fenster des Programms öffne oder, wenn ich das Bedienfenster schließe und neu
    öffne, wechselt die Instanz meiner Controls, so dass mein Code nicht mehr funktioniert.

    Das EditFeld spreche ich so an:
    ControlClick("MyTitle", "", "[CLASS:Edit; INSTANCE:6]")
    ControlSend("MyTitle", "", "[CLASS:Edit; INSTANCE:6]", $Befehl)
    Mein Edit Feld hat dann z.B. irgendwann diesen Wert:[CLASS:Edit; INSTANCE:13]

    Die Buttons spreche ich so an:
    ControlClick("MyTitle", "", "[CLASS:Button; INSTANCE:40]")
    Später dann dieser Wert:[CLASS:Button; INSTANCE:111]


    Experimentiert habe ich schon mit folgender Funktion:
    $Out=_ControlGetHandleByPos("MyTitle","",60,341)
    um den Handle abzufragen. Funktioniert beim ersten mal gut aber komischerweise bekomme ich nachdem die Instanz anders
    geworden ist über die Funktion immer noch die "alten" Handle, die dann aber nicht mehr funktionieren.

    Da ich mit dem Thema AutoIt ganz neu und frisch unterwegs bin, hoffe ich, dass mein Problem für euch leicht lösbar ist.
    Im Moment funktioniert mein Code nur, wenn ich das Programm neu starte und das Fenster das ich steuern will als erstes direkt öffne.
    Schließe ich es und öffne es neu geht es nicht mehr. Öffne ich erst ein anderes geht es auch nicht.

    Hat irgendjemand eine gute Idee !!!????!!!!

    Gruß
    Lars

  • Da ich keine Ahnung habe welches Programm du bedienen möchtest und es für mich nach einer Installationsroutine aussieht kann ich dir folgendes vorschlagen.

    1. Hat das Programm vielleicht Hotkeys über die du arbeiten kannst? z.B. ALT+N

    2. Du sprichst den einen Button ohne Text an. Meistens hat ein Button aber auch einen hinterlegten Text dann könntest du mal folgendes ausprobieren


    [autoit]

    ControlClick("MyTitle", "&Next >", "Button")

    [/autoit]

    Und falls du nochmal einen Autoit-Code postest verwende dafür dann den entsprechenden BB-Code

  • Hallo AyKay,

    danke für deine Antwort!

    Das Programm hab ich nicht weiter benannt, weil es sowieso keiner kennen wird, ist keine Installationsroutine sonder eine
    Diagnosetool aus der Automotive Welt.

    HotKeys haben die Buttons leider nicht und Text ist auch nicht dahinter

    >>>> Control <<<<
    Class: Edit
    Instance: 6
    ClassnameNN: Edit6
    Name:
    Advanced (Class): [CLASS:Edit; INSTANCE:6]
    ID: 394814
    Text:
    Position: 60, 341
    Size: 712, 38
    ControlClick Coords: 230, 21
    Style: 0x54010080
    ExStyle: 0x00100200
    Handle: 0x0006063E

    Welche Möglichkeiten hab ich denn noch, nach Controls zu suchen?
    Komisch finde ich auch noch, dass mir die Funktion _ControlGetHandleByPos, die über alle Controls geht und die angegebene Position abfragt
    den "alten" Handle zurückgibt obwohl dieser laut AutoItWindowInfo nicht mehr richtig ist.

    Bin für jeden Tip dankbar.

  • Habe mittlerweile einen Workaround gefunden, der mich aber nicht wirklich zufrieden macht.

    Wenn ich über die Funktion ControlGetHandleByPos immer die letzte Instanz nehme, die ich finde, passt es.
    Er findet aber auch die "alten" Controls, die eigentlich nicht mehr existieren sollten, da das Fenster geschlossen wurde und
    neu geöffnet ist.

    Ist doch etwas seltsam oder. Ist das Prog, das ich steuern will vielleicht einfach scheiße geschrieben, dass die Controls nicht sauber abgebaut werden oder sowas?

    Gruß
    Lars

  • Hi,

    Zitat

    Ist doch etwas seltsam oder. Ist das Prog, das ich steuern will vielleicht einfach scheiße geschrieben, dass die Controls nicht sauber abgebaut werden oder sowas?

    Willkommen in der Windows-Welt!
    Die meisten von M$ oder deren Programmiersprachen erstellten Programme kümmern sich einen SCHEISS! um die von M$ "vorgegebenen" Windows-Konventionen! Da werden in den Fenstern irgendwelche esoterischen (teilw. Browser ! ) - Plugins verwendet um Listen, Tabellen und deren Controls zu verwenden um jeden Zugriff auf den Inhalt wirkungsvoll zu verhindern, "Tastatursteuerung" (bspw. Tab führt ins nächste Edit/Feld/Menüpunkt/Button) wird völlig ignoriert und schlussendlich findet man heraus, dass es "eindeutige Handles" garnicht gibt (s. quote) !
    Und das wird alles nicht besser, sondern in letzter Zeit schlimmer...den "neuen" tollen Programmiersprachen sei Dank...
    Ich habe wohl oder übel in letzter Zeit dienstlich wieder häufiger auf "PushTheButton" (sic) zurückgreifen müssen, weil eine Automatisierung auf anderem Weg garnicht möglich ist/war ;(

  • Da niemand eine Idee hat, was ich falsch mache, denke ich wirklich, dass das Prog einfach schlecht umgesetzt ist.

    Mein Workaround funktioniert immerhin ganz gut, hab den Code jetzt auch in C# übersetzt und er klappt.

    Also kann ich mich jetzt aufs Automatisieren konzentrieren. AutoIt ist einfach klasse, ich bin jetzt seit einer Woche dran
    und die Ideen hören gar nicht auf zu sprudeln :)

    Gruss Lars