Hmm, das klingt interessant.
Vielleicht sollte ich mir das mal genauer ansehen.
Wie heißen die Befehle, damit ich das nachschlagen kann?
Wie ist das, wenn ich das auf einem PC fertigstelle und dann auf einem anderen umsetzen will, ändern sich dann die Koordinaten?
Hilfe bei der Automatisierung: Wie greife ich auf Felder in einer Herstellersoftware zu?
-
Muecke_1982 -
24. November 2024 um 12:39 -
Erledigt
-
-
Irgendwie stand nichts mehr da was ich grad geschrieben habe.
Also die Coords stimmen im Info tool nicht mehr 100%tig glaube aber das liegt an der Windows GUI,
aber hier hast du mal ein beispiel was peter meinte wenn ich richtig liege.
AutoIt
Alles anzeigen; Skript starten ; Öffnet den Explorer mit dem Befehl für die bluetootheinstellungen Run("explorer.exe ms-settings:bluetooth") ; Führt den URI-Befehl über den Explorer aus WinWaitActive("[CLASS:ApplicationFrameWindow]", "", 10) ; Warten, bis das Fenster der bluetootheinstellungenaktiv ist ; Setzt die Maus-Koordinaten relativ zum Fenster Opt("MouseCoordMode", 2) ; 2 = Fenster-relative Koordinaten ; Fenster positionieren WinMove("[CLASS:ApplicationFrameWindow]", "", 100, 100) ; Verschiebt das Fenster oben links ; Mausbewegung und Klick auf eine Position innerhalb des Fensters MouseMove(155, 235, 5) ; Bewegt die Maus auf eine feste Position relativ zum Fenster MouseClick("left") ; Klickt auf die aktuelle Position Sleep(500) MouseClick('left',155, 235, 1, 5); Klickt auf die aktuelle Position Sleep(50) MouseClick('left',168, 292, 1, 5); Klickt auf die aktuelle Position Sleep(50) MouseClick('left',143, 336, 1, 5); Klickt auf die aktuelle Position Sleep(500) ; Fenster schließen WinClose("[CLASS:ApplicationFrameWindow]") WinWaitClose("[CLASS:ApplicationFrameWindow]", "", 5)
-
Hi,
wie BananaJoe geschrieben hat macht eine Automatisierung von RibbonBars oder auch einfach von .Net Anwendungen nur Sinn mit der UI_Automation.
Da führt kein Weg vorbei. Ich habe selbst erst kürzlich mich in dieses Thema einarbeiten müssen. Ist recht zeitintensiv bis man die Zusammenhänge alle verstanden hat. Aber Dinge wie click, click und Coords ist nicht zielführend. Leider setzen auch nicht alle Programmierer auf alternative Steuerung durch die Tastatur.
Als Einstieg kann ich dir nur erklären, dass alle Objekte in .Net in hirarchischen Zweigen aufgeteilt sind. Diese Klassen haben dann die ganzen Objekte in sich wie Eingabefelder, Fenster, Grids, Buttons uswMit Anwendungen wie UISpy und M$ Inspect kann man diese Hirarchie auslesen aus einem laufenden Programm und sich dann die Objekte heraussuchen, die man ansprechen möchte.
Ist zeitraubend und aus meiner SIcht war das eher der Versuch die Automatisierer davon abzuhalten, diese Anwendungen zu steuern.
Aber wie das so in einer Community ist, finden sich da immer findige Leute wie LarsJ, die sich die Zeit nehmen und das ganze für uns zerlegen.Daher kann auch ich nur empfehlen, lese die Beiträge von LarsJ, arbeite die Beispiele ab und mit der Zeit macht es bei dir klick und dann kannste loslegen.
Das wird dir hier auch keiner "vorprogrammieren" können, da wir weder die Anwendung noch die darin enthaltenen Objekte und deren Namen kennen.
-
Hi Schnuffel 👋 ,
sehr guter Beitrag meiner Ansicht nach. Ich stimme dir bei allem zu 👌 , bis auf eine Kleinigkeit:
[...] da wir weder die Anwendung noch die darin enthaltenen Objekte und deren Namen kennen.
Schau' dir gern mal den Spoiler-Text von Muecke_1982 aus dem post#13 an (und ja, sehr versteckt und untergegangen die Info dazu).
Wir könnten es theoretisch nachstellen, doch wo bleibt dann der Lerneffekt 🤝 .Der Einstieg in UIA ist sicherlich einfacher, wenn man Erfahrung mit .NET (C# etc.) hat, doch die Beispiele von LarsJ sind gut und man kann sich durcharbeiten, ganz richtig. Vielleicht ist das für irgendjemand hier ein guter Auftakt um ein Tutorial zu erstellen (in welcher Form auch immer). Mich lockt es, doch Zeit habe ich dafür keine.
Naja, freut mich von dir gelesen zu haben Schnuffel, gern auch wieder öfter 😁 .
Viele Grüße
Sven -
Vielleicht ist das für irgendjemand hier ein guter Auftakt um ein Tutorial zu erstellen (in welcher Form auch immer).
Ich habe mal ein kleines Tutorial gemacht, um die UIASpy.au3 zum Laufen zu bringen und das mit Screenshots dokumentiert.
-
wie heisst den die Software. Wenn die kostenlos ist, findet sich vielleicht jemand der dir einen funktionalen Ansatz liefert
-
Also ich werde das mit den Koordinaten mal ausprobieren. wahrscheinlich erst am WE und hoffe, dass ich das hinbekomme.
Die Software ist kostenlos wenn man Kunde ist.
Und hier sind die Daten zu groß, dachte ich versuche es mal so: https://we.tl/t-TNEUnwunrh
Hoffe das klappt, die Software muss nicht installiert werden! -
Wir könnten es theoretisch nachstellen, doch wo bleibt dann der Lerneffekt 🤝 .
Ja, da gebe ich dir Recht, der Lerneffekt ist nicht wirklich da.
Im Moment habe ich den Lernefekt, ich bin kein Programmierer, und für mich ist das alles ein bisschen verwirrend, und ich bekomme es nicht zum Laufen, der Aufwand, den ich habe, um die Hilfen zu erstellen (zum Klicken und Eingeben), ist zu groß, also unterm Strich bin ich wahrscheinlich schneller und frustfreier am Ziel, wenn ich es lasse.
-
Hi Muecke_1982 👋 ,
kannst du bitte mal deine Schritte welche du automatisieren möchtest auflisten bzw. zeigen? Dann können wir entweder mit mouse actions konkret helfen bzw. zeigen wie es geht oder noch besser, direkt mit UIA arbeiten und genau deinen Ablauf mal ausprobieren/implementieren.
Ich meine nicht, dass wir dir das komplett abnehmen werden (außer es fühlt sich jemand dazu berufen - dann gern auch so 😇), doch zumindest hättest du dann ein konkretes Beispiel wie es geht.
Also was mir persönlich helfen würde sind Bilder mit einer Klickreihenfolge. Dann ist klarer was wann wie gemacht werden soll. Ein Video wäre natürlich noch toller, doch so wie es deine Zeit hergibt ... Bilder. Bin recht zuversichtlich, dass du dann Code bekommst, welcher dir ganz konkret helfen wird 👌 .
Viele Grüße
Sven -
Hey SOLVE-SMART ,
Oh, das würde ich gerne machen, mit Bildern kann ich das, ein Video, ich weiß nicht, wie ich meinen Bildschirm aufnehmen kann.
Mit der Maus hab ich vorhin ein bisschen probiert.
Das klappt mal und mal nicht, ab und zu ist beim Programmstart irgendwas nicht so, wie es sein soll, dann stimmt das Klicken nicht mehr :-(.
Zum Testen habe ich einfach mal die Sprache umgestellt.
Wenn das mit den UIA klappen würde und ich es kapiren würde, sagt mir mein Bauchgefühl das das Programm zuverläsiger sein word wie das Mausklicken.
Den richtigen Ablauf würde ich dann in Bildern zusammenfassen, das hilft mir auch selbst zu sehen, was ich eigentlich wann machen muss / sollte.
Das ist mein aktueller Code dazu:
Code
Alles anzeigen; Include ; MsgBox Fungzinen #include <MsgBoxConstants.au3> ; Skript starten ; Programm öffnen Run("D:\Server\Ropex\ROPEXvisual 2.0 540000311\RopexVisualLaunch.exe") Sleep(5000) ; Aktives Fenster von Ropex finden Local $Fenster_aktiv = FindWindowByTitle("ROPEXvisual® V3.11 -") ; Fenster Aktiv setzen WinActivate($Fenster_aktiv) WinWaitActive($Fenster_aktiv, "", 10) ; Warten, bis das Fenster aktiv ist ; Fenster positionieren WinMove($Fenster_aktiv, "", 100, 100) ; Verschiebt das Fenster oben links ; Setzt die Maus-Koordinaten relativ zum Fenster Opt("MouseCoordMode", 0) ; 2 = Fenster-relative Koordinaten ; Programm ins Vollbildmodus MouseMove(300, 15, 5) ; Bewegt die Maus auf eine feste Position relativ zum Fenster MouseClick("left", Default, Default, 2) ; Doppelklick auf aktuellen Position Sleep(500) ; kurz warten ; Menüband: Einstellungen / Sprache MouseClick('left', 150, 50, 1, 5) ; Settings MouseClick('left', 370, 80, 1, 5) ; Sprache MouseClick('left', 950, 500, 1, 5) ; Dropdown MouseClick('left', 50, 80, 1, 5) ; Deutsch MouseClick('left', 60, 155, 1, 50) ; OK ; ************************************************************************************* ; Funktion: FindWindowByTitle ; Beschreibung: Diese Funktion durchsucht alle geöffneten Fenster nach einem Titel, der ; mit einem bestimmten Suchbegriff beginnt, und gibt den ersten passenden ; Fenstertitel zurück. ; Autor: ChatGPT (unterstützt von ...) ; Version: 1.0 ; Datum: 05.12.2024 ; ************************************************************************************* Func FindWindowByTitle($searchTitle) ; Funktion: FindWindowByTitle ; Parameter: ; $searchTitle (String): Der Suchbegriff, mit dem der Fenstertitel beginnen soll. ; Rückgabewert: ; (String): Der Titel des ersten gefundenen Fensters, das mit dem Suchbegriff beginnt. ; Gibt einen leeren String zurück, wenn kein Fenster gefunden wurde. ; Variablen initialisieren Local $windowTitle, $windowList, $foundTitle = "" ; Liste aller geöffneten Fenster abrufen $windowList = WinList() ; Durch alle Fenster iterieren For $i = 1 To $windowList[0][0] ; $windowList[0][0] enthält die Anzahl der Fenster ; Fenstertitel des aktuellen Fensters abrufen $windowTitle = $windowList[$i][0] ; Prüfen, ob der Fenstertitel mit dem Suchbegriff beginnt If StringLeft($windowTitle, StringLen($searchTitle)) = $searchTitle Then ; Wenn ein passendes Fenster gefunden wurde, speichern und Schleife beenden $foundTitle = $windowTitle ExitLoop EndIf Next ; Den Fenstertitel oder einen leeren String zurückgeben Return $foundTitle EndFunc
-
Hallo SOLVE-SMART,
ich habe alles einmal zusammengetragen und hoffe, dass ich keinen Schritt übersehen habe.
Meine Testreihe 1 habe ich als CSV angehängt. Dort sind nur die Parameter enthalten, die eingetragen werden sollen. Diese Testreihe muss ich leider 2 bis 3 Mal durchlaufen.
Dabei ändert sich allerdings zwischen den Testreihen nur die Hardware, nicht die Software. (die .txt ist eigendlich ein .csv Datei)
Den Ablauf habe ich in einer PDF dokumentiert, die ebenfalls im Anhang ist.
Die Schritte 1 und 2 müssen nur einmalig ausgeführt werden. Das kann ich auch zu Beginn manuell machen, wenn sichergestellt werden kann, dass das Fenster anschließend korrekt von der Software erkannt wird.
Die Schritte 3 bis 6 sollten in einer Schleife so lange ausgeführt werden, bis keine Parameter mehr in der CSV-Datei vorhanden sind.
-
Hallo Muecke,
ich hab mir mal das Programm heruntergeladen und dir die "ersten Schritte" geprogged.
Auf aufwendiges Errorhandling habe ich für die Übersichtlichkeit des UI-Codes mal verzichtet.
Sollte aber grundsätzlich immer genutzt werden.Wenn deine Software auf englisch gestartet ist (das macht das Script jetzt nicht),
wird nach Start des Scriptes auf "Settings" und dann auf "Language" geklickt.Wenn du an UI_Automation tieferes Interesse hast, kommst du aber nicht umhin, dich da einzuarbeiten.
Es ist alles absolut objektorientiert. Für jedes neue Objekt wird eine zuweisbare Variable benötigt.
Dann muss für jedes "Ding" ein eigenes Object erstellt werden.
Das sollte jeweils auf Fehler überprüft werden.Im Anhang hab ich auch noch die UIA_Spy als exe mit angehängt. SO kannst du die nebenbei mitlaufen lassen und proggen.
Viel Erfolg
-
Wow, danke!
Für mich ist das zum ersten Mal sehr viel und es wird eine Weile dauern, bis ich das alles verstanden habe.
-
Schnuffel Zuerst einmal ist es mega, was du für mich getan hast. VIELEN DANK.
Im Moment versuche ich herauszufinden, was in "ROPEX_Demo.au3" gemacht wird.
Aber ich verstehe es nicht ganz
Mit deinem Code wird das Fenster gefunden und das Menü kann bedient werden.
Da sich ständig neue Fenster öffnen, muss ich dann das neue Fenster suchen.Fenster suchen und merken ist hier:
Code; Find Main Window $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, $ROPEXTitle, $pCondition ) ; Window Title $oDesktop.FindFirst($TreeScope_Descendants, $pCondition, $pROPEXe) $oROPEXe_Main = ObjCreateInterface($pROPEXe, $sIID_IUIAutomationElement, $dtagIUIAutomationElement)
Dazu muss ich die $ROPEXTitle und die $oROPEXe_Main neu machen?
Und das ist dann der Code zum Anklicken:
Code; Click butten Menübar = Settings => Language $oUIAutomation.CreatePropertyCondition($UIA_ControlTypePropertyId, $UIA_ButtonControlTypeId, $pCondition1) ; Klick Button $UIA_ControlTypePropertyId $UIA_ButtonControlTypeId $oUIAutomation.CreatePropertyCondition($UIA_NamePropertyId, "Language", $pCondition2) ; Name des Klick-Buttons als 2. Condition $UIA_NamePropertyId $oUIAutomation.CreateAndCondition($pCondition1, $pCondition2, $pAndCondition) $oROPEXe_Main.FindFirst($TreeScope_Descendants, $pAndCondition, $pKlickButton) $oKlickButton = ObjCreateInterface($pKlickButton, $sIID_IUIAutomationElement, $dtagIUIAutomationElement) $oKlickButton.GetCurrentPattern($UIA_ValuePatternId, $pValue) WinActivate($ROPEXTitle) UIA_MouseClick($oKlickButton)
Und hier muss ich die beiden Daten, die du schon in den Kommentaren hast, anpassen:
Dazu muss ich dann das $oROPEXe_Main mit der neuen Fenstervariablen ersetzen, die ich oben gesucht habe. Und hier WinActivate($ROPEXTitle) kommt dann noch der Titel des Fensters hinzu.
Wenn ich das bisher richtig verstanden habe, dann muss ich noch ein bisschen experimentieren, bis ich das alles hinbekomme. Aber dann weiß ich, dass ich auf dem richtigen Weg bin.
Wie macht ihr das, dass ihr den Überblick behaltet, für mich sehen das fast immer alle gleich. -
So hatte ich es verstanden. Aber leider funktioniert das nicht.
Habe den Code einfach unten dran gehängt:
Code
Alles anzeigenGlobal $LanguageTitle = WinGetTitle("Language selection",'') ; Find Main Language selection $oUIAutomation.CreatePropertyCondition( $UIA_NamePropertyId, $LanguageTitle, $pCondition ) ; Window Title $oDesktop.FindFirst($TreeScope_Descendants, $pCondition, $pROPEXe) $oROPEXe_Language = ObjCreateInterface($pROPEXe, $sIID_IUIAutomationElement, $dtagIUIAutomationElement) ; Click button Menübar => Settings $oUIAutomation.CreatePropertyCondition($UIA_ControlTypePropertyId, $UIA_ButtonControlTypeId, $pCondition1) ; Klick Button $UIA_ControlTypePropertyId $UIA_ButtonControlTypeId $oUIAutomation.CreatePropertyCondition($UIA_NamePropertyId, "OK", $pCondition2) ; Name des Klick-Buttons als 2. Condition $UIA_NamePropertyId $oUIAutomation.CreateAndCondition($pCondition1, $pCondition2, $pAndCondition) $oROPEXe_Language.FindFirst($TreeScope_Descendants, $pAndCondition, $pKlickButton) $oKlickButton = ObjCreateInterface($pKlickButton, $sIID_IUIAutomationElement, $dtagIUIAutomationElement) $oKlickButton.GetCurrentPattern($UIA_ValuePatternId, $pValue) WinActivate($LanguageTitle) UIA_MouseClick($oKlickButton)
-
Schnuffel: Hast Du in der UIASpy.ini -> WindowsMode=Windows 10 Last eingestellt? Kann man über UIASpy.exe -> Options -> Windows -> Mode kontrollieren.
Dann bekomme ich folgendes:
Local $oUIAutomation = ObjCreateInterface($sCLSID_CUIAutomation8, $sIID_IUIAutomation6, $dtag_IUIAutomation6)
-
erstmal ein großes Lob für die Mühe und den Aufwand, der hinter der Nutzung von uia_functions steckt! diese Methode ist definitiv eine durchdachte und leistungsstarke Möglichkeit, das Programm zu steuern.
Die Struktur und Möglichkeiten, die damit geboten werden, sind beeindruckend.
Es hört sich nach viel Arbeit an, er kann wenn er will ja auch beide Methoden vereinen.
den ich habe zum Beispiel keine Ahnung wie ich die Subfenster größer/kleiner machen kann, oder bzw. verschieben.
ich weiß nicht wie man das innerhalb des Programms zurechtschieben kann, falls ein Nutzer auf die idee kam die fenster mal zu verschieben.Da wäre uia bestimmt sehr nützlich wenn man es versteht
ich habs bisher noch nicht verstanden.
Die dinge die du innerhalb der Sub- Fenster erreichen willst sind immer fest
- Eine Möglichkeit die ich mir gedacht habe man belässt die Fenster so wie sie beim ersten start waren, wenn dann ein Fenster befüllt werden soll wird es innerhalb des programmes maximiert und die statischen elemente im subfenster dann per mouseclick angeklickt und per controllbefehen ausgefüllt und bestätigt.Wie gesagt leider hänge ich an den Fenstergrößen/Anordnung innerhalb des Programms. Es gibt zwar diesen einen reiter im ribbon menu aber das ist ja nicht zu 100% immer identisch (kommt auf den nutzer drauf an, ich als nutzer musste natürlich an den fenster größen spielen ^^) ich schätze das müsste man auch mit uia lösen wenn man diesen menü punkt nutzen möchte.
oder diese ribbon udf? keine Ahnung hab ich auch noch nie mit gearbeitet.Allerdings sobald sich ein Menüpunkt öffnet, lassen sich die darin enthaltenen Steuerelemente ganz einfach mit ControlClick, ControlSetText oder ähnlichen AutoIt-Befehlen bedienen. Das würde dir etwas Arbeit sparen deshalb der Vorschlag beide Vorschläge zu verwenden und nicht alles bis aufs kleinste zu objektisieren^^.
Der Vorteil dabei ist, dass alle Fenster und Steuerelemente, die sich öffnen lassen, durch das AutoIt-Info-Tool leicht ausgelesen werden können. Dadurch ist die Steuerung nicht nur unkompliziert, sondern auch sehr direkt. Besonders praktisch ist, dass Eingabefelder, Buttons und andere Elemente so gezielt angesprochen werden können.Schnuffel – Danke nochmal für die Aufarbeitung, die in der anderen uia-Methoden steckt – sie ist sicherlich in vielen Szenarien unverzichtbar! Leider für Menschen die damit noch nicht gearbeitet haben schwer zu durchschauen.
Aber hier habt ihr meine Variante bisher : (die Ordnerstrucktur : @ScriptDir & "\ROPEXvisual 2.0 540000311\RopexVisualLaunch.exe ) mit Debug Zeilen zum schritte kontrollieren. @edit: mache morgen weiter hab grad noch ne Möglichkeit gesehen evtl. geht es.
Code
Alles anzeigenOpt("MouseCoordMode", 2) ; Relative zum aktiven Fenster Global $Debug = True ; Debug-Modus: True = Langsamer mit Debug-Meldungen, False = Normal ; Funktion: Debug-Meldungen und Pausen Func DebugMsg($message) If $Debug Then MsgBox(64, "Debug", $message) ConsoleWrite("Debug :"& $message &"sleep 0,5sec"&@CRLF) Sleep(500) ; 500ms Pause für visuelle Verfolgung EndIf EndFunc ; Funktion: Programm starten Func StartProgram() Local $programPath = @ScriptDir & "\ROPEXvisual 2.0 540000311\RopexVisualLaunch.exe" If Not FileExists($programPath) Then MsgBox(16, "Fehler", "Programm nicht gefunden: " & $programPath) Exit EndIf DebugMsg("Starte Programm: " & $programPath) Run($programPath) DebugMsg("Warte auf Fenster: ROPEXvisual® V3.11 - Controller.Parameter.Konfiguration") ; Warten, bis das Hauptfenster verfügbar ist WinWait("ROPEXvisual® V3.11", "", 15) ; Max. 15 Sekunden warten If Not WinExists("ROPEXvisual® V3.11") Then MsgBox(16, "Fehler", "Das Programm konnte nicht gestartet werden.") Exit EndIf ; Fenster aktivieren und maximieren DebugMsg("Fenster gefunden, aktiviere und maximiere") WinActivate("ROPEXvisual® V3.11 - Controller.Parameter.Konfiguration") WinSetState("ROPEXvisual® V3.11 - Controller.Parameter.Konfiguration", "", @SW_MAXIMIZE) EndFunc ; Funktion: Sprache ändern Func ChangeLanguage() DebugMsg("Klicke auf Settings mit MouseClick") MouseClick("left", 149, 53) ; Koordinaten für Settings DebugMsg("Klicke auf Language mit MouseClick") MouseClick("left", 361, 88) ; Koordinaten für Language DebugMsg("Warte auf Dialog: Language selection") WinWait("Language selection", "", 5) If Not WinExists("Language selection") Then MsgBox(16, "Fehler", "Der Dialog für die Sprachauswahl konnte nicht geöffnet werden.") Exit EndIf ; Sprache auswählen DebugMsg("Wähle Sprache: Deutsch") ControlCommand("Language selection", "", "ComboBox1", "SelectString", "Deutsch") ; Klicke auf OK DebugMsg("Klicke auf OK") ControlClick("Language selection", "", "Button1") ; Warten, bis das Hauptfenster wieder aktiv ist DebugMsg("Warte auf Rückkehr zum Hauptfenster") WinWaitActive("ROPEXvisual® V3.11 - Controller.Parameter.Konfiguration", "", 5) EndFunc ; Funktion: Freigabe aktivieren Func EnableAuthorization() DebugMsg("Klicke auf Menü 'Einstellungen'") MouseClick("left", 149, 53) ; Koordinaten für Einstellungen DebugMsg("Klicke auf Schaltfläche 'Freigabe'") MouseClick("left", 315, 93) ; Koordinaten für Freigabe DebugMsg("Warte auf Passwort-Dialog") WinWait("Zugangsberechtigung", "", 5) If Not WinExists("Zugangsberechtigung") Then MsgBox(16, "Fehler", "Der Dialog für die Zugangsberechtigung konnte nicht geöffnet werden.") Exit EndIf DebugMsg("Gebe Passwort ein: ropex3") ControlSetText("Zugangsberechtigung", "", "Edit1", "ropex3") ; Passwort eingeben DebugMsg("Klicke auf OK im Passwort-Dialog") ControlClick("Zugangsberechtigung", "", "Button1") ; OK klicken DebugMsg("Warte auf Rückkehr zum Hauptfenster") WinWaitActive("ROPEXvisual® V3.11 - Controller.Parameter.Konfiguration", "", 5) DebugMsg("Freigabe erfolgreich aktiviert.") EndFunc ; Hauptprogramm StartProgram() ChangeLanguage() EnableAuthorization()
-
die Einstellungen der ini habe ich gar nicht berücksichtigt.
Steht bei mir auf Windows 7.
PS: ich hab mir die UIA_Spy mal angesehen... In der Auswahl wird mein Win_11 noch gar nicht berücksichtigt und fällt daher auf Windows_7 zurück.
Ob die IDs wirklich einen Unterschied machen kann ich nicht beurteilen, dazu müsste ich diese bei M$ vergleichen.
Solange alles trotzdem funktioniert, sehe ich keinen Handlungsbedarf. -
Muecke_1982 mir war nicht bewusst, dass du noch ein "Neuling" in der Automatisierung bist.
Du hast dir da schon eine Herausforderung gesucht, an der ich als Neuling sicherlich verzweifelt wäre.
Es sind einfach zu viele Dinge, die vorausgesetzt werden und die man verstehen muss,
um UI_Automation vernünftig und in vertretbarer Zeit erstellen zu können.Zum Einen brauchst du das Grundwerkzeug autoit und zum anderen ein Verständnis von Objekten.
Diese gehören nicht zum Standardumfang von autoit. Vielleicht hat sich auch deswegen keine große Schar an Leuten dem Thema UI gewidmet.
Dabei ist das ganze schon über 10 Jahre alt.
Wenn sich hier nicht jemand findet, der dir das Thema in einem Workshop aufarbeitet, wrden 2 Std. nicht reichen um den Code zu verstehen.Nach meinem Verständnis von UI:
Grundsätzlich ist jedes Fenster in einem Hirarchischen Baum aufgeteilt. Gesehen wird immer nur, was du auch real sehen kannst.
Dabei sind die Objekte darin aufgehangen. Jedes "Objekt" (TabItem, Button, Input, ...) hat Eigenschaften.
Bei der hier vorgestellten Methode wird stumpf das sichtbare Fenster nach einem Objekt mit den gegebenen Eigenschaften durchsucht.
Das Gefunde Objekt wird dann referenziert um es ansprechen zu können. Dann kann das Objekt getriggert werden mit z. B. ändern des Textes, Eingaben, klicken, und und und
Wenn sich die Ansicht des Fensters und seiner Objekte ändert, muss wohl die gesamte Objekthirarchie des Fensters neu "durchsucht" werden,
um ein Objekt mit den passenden Eigenschaften zu finden. Dieses wird dann wieder referenziert und kann getriggert werden.So würde ich das im groben erklären wollen nach meinem Verständnis.
Da die Ansteuerung an sich "0" Errorhandling beinhaltet, muss jede Aktion selber abgefangen werden.
Bequeme Funktionen die einem das abnehmen habe ich bisher nicht gefunden. Ich war schon drauf und dran diese selbst zu schreiben, aber das würde bei mir recht lange dauern. Und da ich mit UI nur gelegentlich zu tun habe, möchte ich mir das nicht antun.Bei dem Umfang deiner gewünschten Automatisierung inkl. Test und Errorhandling, ist das schon ein durchaus relevantes Projekt, dass so kostenfrei hier wohl nicht für dich umgesetzt wird. Daher wirst du (bei einer relativ gesicherten Steuerung) um eine eigene Einarbeitung nicht herum kommen.
Wenn ich dir dabei Fragen beantworten kann, versuche ich das gerne. Aber die komplette Automatisierung schreiben übersteigt ein Hilfeforum deutlich.
-
Nun fehlt mir doch schon wieder das "Daumen hoch" Emoji. Stimme dir absolut zu Schnuffel , gut zusammengefasst.
Diverse wrapper functions zu schreiben, wenn es nur einen Anwendungsfall gibt, wäre mir auch zu anstrengend. Vielleicht reicht ihm am Ende ja doch ein "relativ" robustes Maus-Klicken und fertig 🤔 .
So wie du es formuliert hast juckt es mich schon eine Umsetzung zu schreiben, doch realistisch habe ich keine Zeit dazu, daher lass ich es lieber bevor andere (wirkliche) Projekte hinten runter fallen.
-----------------
Ich drücke dir die Daumen Muecke_1982 🤞 .
Viele Grüße
Sven -