Können Controls bei einem (nicht Autoit) Programm nach einem Neustart unterschiedliche Instance Nummern aufweisen

  • Hallo Freunde der automatisierten Schritte,

    dank der sehr guten Hilfe von Make-Grafik im Thread

    Hauptfenster - Kindfenster - Maus setzen - Text einfügen


    konnte ich in PC-Notizz Text an Controls senden.


    Nach einem Rechner-Neustart und Programm-Neustart funktionierte das Script nicht mehr. Der Fehler war schnell gefunden. Die Instance-Nummerierung in PC-Notizz hatte sich laut Autoit-Info-Tool (Reiter: Control) geändert - siehe unten - und das, obwohl sich am Fensteraufbau optisch nichts geändert hat.

    (nicht verwirren lassen, Make-Grafik hat Version 7, ich Version 6 von PC-Notizz)

    ;Global $hKategorie = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:3]') ; funktionierte bisher in Version 6
    Global $hKategorie = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:2]') ; heute mit Autoit-Tool ausgelesen


    ;Global $hStichwoerter = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:2]') ;
    funktionierte bisher in Version 6
    Global $hStichwoerter = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:1]') ; heute mit Autoit-Tool ausgelesen

    Wie geht Ihr damit um, wenn die Controls in einem Programm eine gleiche Klasse, z.B. Tedit, keinen Namen und eine wechselnde Instance-Nummerierung aufweisen? Wie kann man solche Controls eindeutig indentifizieren und somit ansteuern?

    Viele Grüße
    AutoMit

  • Wie geht Ihr damit um, wenn die Controls in einem Programm eine gleiche Klasse, z.B. Tedit, keinen Namen und eine wechselnde Instance-Nummerierung aufweisen? Wie kann man solche Controls eindeutig indentifizieren und somit ansteuern?

    Ist mir ehrlich gesagt noch nicht untergekommen.
    Das liegt aber auch sicherlich daran, dass ich
    a) Programme, welche ich "fernsteuere", weder Update noch irgendwelche Einstellungen ändere. (und schon garnicht irgendwelche Einstellungen speichere! )
    b) beim Scripten tunlichst darauf achte, dass das AutoIt-Script das Programm in vorgegebenem Environment startet, und nicht "irgendwo" im Programm eine Userinteraktion zum Starten des Scripts erforderlich ist, das geht zu 100% in die Hose!

    Wenn die Namen von Controls trotzdem wechseln, dann muss man ggf andere Funktionen verwenden. Bei Edit-Controls ist das aber sehr ungewöhnlich, das heisst ja nichts anderes, als dass ein weiteres Edit-Control in diesem Fenster existiert. Wo soll das "auf einmal" herkommen?!

  • ich stelle jetzt nur eine Vermutung an, aber normalerweise werden Controls und deren Instance in der Reihenfolge referenziert, wie sie im Code erstellt werden.
    Wenn Dein Programm die Controls (dein Edit) z.B. abhängig irgendeiner ini-Einstellung erstellt,dann kann ich mir vorstellen, dass dann die Instance-Nr. wechselt.
    Ich habe mir das von Dir erwähnte Programm angesehen und habe festgestellt, dass das Programm sich nicht unbedingt an die Gepflogenheiten der Fensterdarstellung hält. Ich habe das Gefühl das der Author seine eigene Ribbon Bar gebaut hat. Kann mich aber täuschen, da ich das Prog auf einem Server 2012 betrachtet habe und das keine Referenz darstellt.

    Sei es drum, normalerweise werden alle Controls in einem Programm erstellt und nur individuell angezeigt oder eben ausgeblendet.
    Damit ändern sich die Instancen auch nicht.

    Zu deinem Problem habe ich auch keine Lösung.

    MfG Schnuffel

    "Sarkasmus ist die niedrigste Form des Witzes, aber die höchste Form der Intelligenz."
    Val McDermid

    ein paar Infos ...

    Wer mehr als "nur" Hilfe benötigt, kann sich gern im Forum "Programmieranfragen" an uns wenden. Wir helfen in allen Fällen, die die Forenregeln zulassen.

    Für schnelle Hilfe benötigen wir ein ! lauffähiges ! Script, dass wir als Demonstration des Problems testen können. Wer von uns erwartet ein Teilscript erstmal lauffähig zu bekommen, der hat
    1. keine wirkliche Not
    2. keinen Respekt vor Menschen die ihm in ihrer Freizeit Ihre Hilfe anbieten
    3. oder ist einfach nur faul und meint wir coden das für ihn

    In solchen Fällen erlaube ich mir, die Anfrage einfach zu ignorieren. ;)

    • Offizieller Beitrag

    Ich kann mich erinnern, dass ich solch ein Szenario vor Jahren mit irgendeinem Verwaltungsprogramm hatte. Da war kein gescheiter Zugriff, ich konnte nur die Menüleiste referenzieren. Aber die Untermenüs wurden erst zur Laufzeit generiert. Dadurch hing die Instance davon ab, welches Menü in welcher Reihenfolge erstmalig geöffnet wurde.
    Somit ist es durchaus denkbar, dass der TE ein ähnliches Problem hat.
    Wie geht man damit um? - Nun, man sucht nach eindeutigen Identifizierungsmerkmalen (z.B. Fenstertitel + Fenstertext) um darüber zu adressieren. Wenn Fenster erkannt werden, was bei dir der Fall ist, dann gibt es auch immer eine Möglichkeit diese zweifelsfrei zu identifizieren, selbst wenn die Instance von Elementen wechselt. Wenn du mehrere gleichartige Controls hast, dann kannst du diese per Enumeration auflisten und prüfen ob bei jedem Start gleiche Eigenschaften vorhanden sind. Mußt du halt etwas probieren.

  • mit diesem Thema hatte ich oft zu kämpfen. Habe es dann gelöst, indem ich die hWnds in ein Array lade und anhand des Textes oder Reihenfolge diese ansteuere...


    Beispiel:

  • Vielen Dank für Eure Zeilen und das Script, welches (noch) meinen Horizont übersteigt.

    Ich habe das einige Tage beobachtet und es scheint nur die 2 oben genannten Varianten zu geben:

    Eingabefeld: Kategorie - entweder Nr. 2 oder 3
    ;Global $hKategorie = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:3]') ; funktionierte bisher in Version 6
    Global $hKategorie = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:2]') ; heute mit Autoit-Tool ausgelesen

    Eingabefeld: Stichwörter - entweder Nr. 1 oder 2
    ;Global $hStichwoerter = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:2]') ;
    funktionierte bisher in Version 6
    Global $hStichwoerter = ControlGetHandle($hWnd, '', '[CLASS:TEdit; INSTANCE:1]') ; heute mit Autoit-Tool ausgelesen

    Die Größe des TEdit ist änderbar.

    Bleibt nur die Position als unveränderliche Größe.
    Kein Name.

    Eingabefeld: Kategorie - Position = 18, 70
    Eingabefeld: Stichwörter - Position = 18, 530

    Wäre es Eurer Erfahrung nach ein sinnvoller Weg, die Position des Controls abzufragen und danach festzulegen, wozu es gehört (also zu Kategorie oder Stichwörter)?

    (für eine aufwendige Variante mit Handles und Arrays fehlt mir (noch) das Wissen ... daher würde ich gerne zuerst eine einfachere Lösung bevorzugen)