Fenster ohne Titel aber mit bestimmten Text 'abfragen'?

  • Hallo Leute,

    ich bin neu hier und will gleich mal meine erste Frage stellen. Bitte habt ein Nachsehen mit mir wenn ich mir nicht alle Forumsregeln oder bereits existierende Beiträge durchgelesen habe. Bei mir brennt es und daher will ich gleich mal loslegen:

    Ich habe AutoIT nun zum ersten mal benutzt um eine automatische Installation von OpenEdge (Progress-DB/ODBC) umzusetzen. Soweit funktioniert es auch bis auf das letzte abschließende 'Ok' am Ende nachdem alles schön installiert wurde.

    Ich kann das Fenster nicht genau bestimmen und bekomme somit kein Focus und kein ControlClick / Send hin.
    Mit dem 'AutoIt v3 Windows Info' bekomme ich zu diesem PopUp-Fenster leider kein Titel bzw. dieser ist Leer.
    Wenn ich nach leeren Titel 'suche' (z.B. wenn ich WinExists benutze) dann bekomme ich immer eine 1 zurückgeliefert. Ich bleibe mal bei WinExists -> Egal ob der Text als 2. Parameter existiert oder nicht! Auch wenn ich als 1. Parameter "[CLASS: Button]" und als 2.PArameter "Ok" angebe findet er nichts.
    Kann mir mal jemand einen Hiweis geben was ich da machen kann? Ich nutze AutoIt erst seit Freitag bei der Arbeit. Also gerade mal erst einen Tag.

    Hier die Summary vom 'AutoIt v3 Windows Info' bezüglich des Buttons welches ich am Ende der Installation drücken möchte, also sobald es erschienen ist:


    Kann mir bitte jemand sagen wie ich das umsetzen kann damit das Script wartet bis dieses Fenster/Control erscheint um dann ein ControlClick abzusetzen bzw. wie ich das Fenster ermitteln kann da ja der Titel fehlt?
    Ich bedanke mich schon einmal im Voraus recht herzlich für eure Hilfe!

    • Offizieller Beitrag

    Probier mal hiermit. Der Suchtext wird als Bestandteil des gesamten im Fenster zu findenden Textes verwendet. Du brauchst also nicht den vollen Text eingeben, sondern nur den relevanten SubText.

    AutoIt
    $hWnd = WinWaitActive('', 'Setup is complete')
    If IsHWnd($hWnd) Then ControlClick($hWnd, '', '[CLASS:Button; INSTANCE:1]')
  • @BugFix

    Danke für die schnelle Antwort.

    Leider klappt es nicht: Egal was ich im Feld 'Text' angebe bekomme ich immer ein IsHwnd = 1.
    Also wenn ich im Textfeld auch "andjasndk" angebe ist das Ergebnis positiv!
    Also wenn ich z.B. folgendes im Script implementiere bekomme ich auch eine 1:

    Code
    msgbox(0,"",IshWnd(WinWaitActive("","fseafs",5)))

    Den Text 'fseafs' gibt es so natürlich nicht...

    Ich teste es momentan in meinem Installationsscript wobei ich alles auskommentiert habe bis auf diese Zeile.

    • Offizieller Beitrag

    Deine Angaben von Windows Info sind die Zusammenfassung, poste bitte mal ausschliesslich das, was im Suchergebnis für Fenster erscheint.
    Mit der Class läßt sich leider nichts anfangen, das ist die ganz allgemeine Windows-Fenster-Klasse. Also jedes Fenster, das nicht speziell anders zugeordnet wurde, ist Angehöriger dieser Klasse.

    Ein Umweg wäre noch:
    - den Prozeß der Installation verwenden
    - die Fenster, die zu diesem Prozeß gehören ermitteln
    - Texte der Fenster auslesen und mit gesuchtem Text abgleichen
    - wenn gefunden: mit diesem Handle den ControlClick ausführen

  • Also wenn ich z.B. folgendes im Script implementiere bekomme ich auch eine 1:

    Code
    msgbox(0,"",IshWnd(WinWaitActive("","fseafs",5)))

    Den Text 'fseafs' gibt es so natürlich nicht...

    Ich teste es momentan in meinem Installationsscript wobei ich alles auskommentiert habe bis auf diese Zeile.

    Na klar bekommst du eine 1.
    Es gibt doch ein aktives Fenster in dem der Text "fseafs" vorkommt - dein Scite-Fenster!
    Es ist aktiv da du das Skript aus diesem heraus startest und es enthält den Text "fseafs" da es ja im Editor für den Programmcode steht.

  • @BugFix

    Das 'Finder Tool' aus dem AutIt v3 Windows Info ziehe ich mit der Maus auf die MSGBOX mit der Meldung 'Setup is complete. You may run the installed program.' und zwar auf den 'OK'-Button um genau zu sein.
    Das was ich in der Summary erhalten habe, habe ich bereits gepostet. Was du nun mit dem Sucheregebnis des Fensters meinst, weiß ich nicht so genau?
    Meinst du den 'visible Text'? Der wäre

    '
    OK
    Setup is complete. You may run the installed program.'

    Wenn ich nicht auf den 'OK' button mit dem 'Finder Tool' gehe, sondern das Fenster, also die Messagebox' auswähle, dann bekomme ich das:

    Dein Umweg hört sich auch vielversprechend an. Ich finde das Fenster mit dem Titel 'setup.exe' (das steht im Titel nämlich so), ermittle die hWnd (was ich bereits in einem der vorherigen Schritte bereits mache) und wie kann ich daraus nun die 'Child-Fenster abfragen?


    @AspirinJunkie

    Wenn das so ist, dann müsste ich es ja hinbekommen wenn ich das Script anders ausführe, also ohne das der Editor offen ist. Da ich absoluter Anfänger was AutoIT ist, weiß ich nicht genau wie ich das anstellen soll?
    Irgendwie kompilieren und dann laufen lassen oder so ähnlich?

  • Wenn das so ist, dann müsste ich es ja hinbekommen wenn ich das Script anders ausführe, also ohne das der Editor offen ist. Da ich absoluter Anfänger was AutoIT ist, weiß ich nicht genau wie ich das anstellen soll?
    Irgendwie kompilieren und dann laufen lassen oder so ähnlich?

    Bingo. Skript kompilieren. Scite schließen (oder dafür sorgen, dass es nicht in den Vordergrund rückt). Die exe starten und fertig.

    Alternativ könntest du auch das Scite-Fenster von der Suche ausnehmen.
    Z.B. so (etwas krude Methode sollte aber funktionieren):

    AutoIt
    msgbox(0,"",IshWnd(WinWaitActive("[REGEXPCLASS:^(?>.(?!ciTEWindow))*$]","fseafs",5)))
  • @AspirinJunkie

    msgbox(0,"",IshWnd(WinWaitActive("[REGEXPCLASS:^(?>.(?!ciTEWindow))*$]","fseafs",5)))

    Leider bringt er mir nun immer eine '0'. Egal ob ich fseafs oder tatsächlich 'Setup is complete' eingebe. ('Setup is complete. You may run the installed program.' steht nach wie vor im Installationsprogramm welches die Eingabe (Klick auf den 'OK'-Buttin) erwartet.

  • Dein Programmcode besteht wirklich nur aus dieser Zeile?
    Du startest das Skript und innerhalb der 5-Sekundenfrist bringst du ein Fenster mit dem Text "fseafs" bzw. "'Setup is complete'" in den Vordergrund (also das Fenster wird aktiv) welches nicht das Scite-Fenster ist.

    Dennoch erschein eine 0?

  • @AspirinJunkie

    Ja, ich habe das Script nun komplett leer gemacht nach dem ' Srcipt Start - Add your code below here' und den Einzeiler eingefügt.

    Hier die komplette Datei:

    Und wenn ich das nun per F5 laufen lasse, dann bekomme ich immer eine '0', egal ob es den Text irgendwo gibt oder nicht (-> dfhjsddjask).

  • Und wenn ich das nun per F5 laufen lasse, dann bekomme ich immer eine '0', egal ob es den Text irgendwo gibt oder nicht

    Dann kommt kein Fenster in den Vordergrund(! - wichtig - nicht die bloße Existenz eines solchen Fensters reicht - es muss auch in den Vordergrund) in dem der Text "Setup is complete" als Visible-Text vorhanden ist.
    Hier mal ein kurzes Video, welches zeigt, dass das Skript prinzipiell funktioniert: http://ge.tt/5YVpG6h2

  • Das mit dem 'im Vordergrund' hat nun geklappt.

    Jetzt habe ich aber das Problem das am Ende beim besagten Fenster der Focus wohl nicht auf dem Fenster ist.

    Ich dachte mir dann: ok, kein Problem. Ich baue ein 'WinActivate' ein (mit dem hWnd des vormals aktiven Fensters).
    Das funktioniert jedoch leider nicht.

    Mein Script kommt zum Ende und das abschliessende Fenster ('Setup is complete..') bleibt offen.

    Wenn ich das Script dann nochmals laufen lasse und alles auskommentiere und nur betreffende Stelle aktiv lasse und ein 'Sleep' von 3 Sekunden einbaue damit ich Zeit habe manuell mit der Maus den Focus zu setzen, funktioniert es! (ohne WinActivate -> mit WinActivate funktioniert auch das nicht).

    Hier die beschriebene Stelle wo es noch hapert:

    Code
    $hWnd = WinWait("setup.exe","",3)
    WinActivate($hWnd) ;WinActivate("setup.exe" <- auch statt $hWnd ausprobiert. Ohne Erfolg)
    $hControl = WinWaitActive("[REGEXPCLASS:^(?>.(?!ciTEWindow))*$]","Setup is complete",240)
    if IshWnd($hControl) Then
    	ControlClick($hControl,"","[CLASSNN:Button1]","",1)
    EndIf

    Wenn ich eine Zeile davor ein Sleep(3000) eingebe und das Script laufen lasse und gleich im Anschluss auf das Installationsfenster klicke, funktioniert es.

    Was könnte ich da jetzt machen um AutoIT anzuweisen auf jeden Fall den Focus auf das Fenster mit dem entsprechenden hWnd zu setzen?

    P.S.
    ich habe nun die Handles per ConsoleWrite ausgegeben lassen:
    Wenn ich das Script manuell nachlaufen lasse (alles andere auskommentiert bis auf dne letzten Absatz) und selber den Focus mit der Maus setze, bekomme ich das Handle des Installations-Fensters.
    Wenn ich es per WinActivate mache bekomme ich eine 0 als Handle!
    Was macht das WinActivate wenn es kein Focus setzt??

    Einmal editiert, zuletzt von IvanE (14. November 2016 um 17:01)

  • Wenn ich probleme mit solchen Fenstern hatte, dann waren es meist WPF Fenster.
    Vieleicht kannst du ja ein Keysend benutzen. Die Abfrage, wegen Admin rechten kriegt man mit sendkeys problemlos weg

    Gruss Roger

  • @autoBert

    Das Fenster IST Modal. Spielt das eine Rolle?
    Blöde Frage, wohl ja sonst würdest du es ja nicht sagen.
    Die Frage ist aber nun: was dann tun?

    @'RogerSt

    Es ist wohl ein System-Modales Fenster wie es autoBert bereits vermutete (Modal ist es und wahrscheinlich ein Windows-Systemfenster).
    Meinst du ein Keysend nutzt da was? Muss ich da nicht trotzdem den Fokus auf das Fenster legen?

  • Systemodal würde sich nicht klicken lassen, Applicationmodal aber schon.

    Zitat von wikipedia


    Modale und nichtmodale Dialoge
    Modale Dialoge sperren den Rest der Anwendung (oder sogar der Benutzeroberfläche), solange der Dialog angezeigt wird.
    Nichtmodale Dialoge erlauben auch Eingaben außerhalb des Dialogs.

    Nimm ab Zeile 3 alles in eine Adlib func, teste mit Consolewrite ob die func auch noch angesprungen wird wenn das gewünschte Fenster aktiviert ist.

  • @autoBert

    Sorry, aber ich habe es falsch verstanden gehabt.
    Es ist ein Modales Fenster, aber kein Windows systemweites Fenster welches mir ALLES andere blockt. Es ist ein Programminternes modales Fenster.


    Es ist im prinzip wie bereits 4 vorherige Fenster die modal aufpoppen. Diese besitzen jedoch einen Titel über welchen ich das Fenster im Script ansprechen kann. Im letzten besagten Fenster gibt es kein Titel und ich kann es einfach nicht abfangen.
    Es ist eine Messagebox die den Installationsvorgang anhält (-> modal) aber eben nicht systemweit. Ohne Titel...

  • Hallo IvanE,

    probier doch mal dem Fenster einen Namen zu verpassen -> WinSetTitle. Probier es mal aus, wenn es klappt, dann hat das Fenster nicht länger keinen Titel und du kannst es viel leichter ansprechen und focus setzen usw.

    mfg
    s.koni

  • Hallo IvanE

    Den Fokus auf das Fenster legen musst du schon.
    Ich konnte problemlos den Fokus auf das Fenster legen, aber der Mausklick funktionierte bei mir nicht.
    Mit Keysend funktionierte es aber problemlos.

    Gruss Roger