AutoIt hört mittendrin auf

  • Hallo zusammen

    ich versuche momentan, mit AutoIt ein Script zu schreiben, das den XC8-Compiler zu MPLAB X hinzufügt (da das unter Windows XP manuell gemacht werden muss). Da ich jedoch noch nicht sonderlich erfahren bin komm ich grad irgendwie nicht weiter.

    Da AutoIt Window Info in MPLAB X leider keine Controls erkennen kann, muss ich immer mit Tastaturbefehlen zu den jeweiligen Optionen navigieren. Falls hier jemand eine bessere Idee hat, immer her damit ;)

    Mein Code sieht folgendermaßen aus:

    [autoit]

    Blockinput(0)

    [/autoit][autoit][/autoit][autoit]

    $vError=0
    $Titel="MPLAB X IDE v1.80"
    $Text=""

    [/autoit][autoit][/autoit][autoit]

    If ($vError==0) Then
    $Titel="MPLAB X IDE v1.80"
    WinActivate($Titel)
    If Not (WinWaitActive($Titel)) Then
    $vError=1
    Else
    Send("{ALT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{ENTER}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")
    ; Navigiert in der Menüleiste zu Tools => Optionen
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If ($vError==0) Then
    $Titel="Options"
    WinActivate($Titel)
    If Not (WinWaitActive($Titel)) Then
    $vError=1
    Else
    Send("{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{ENTER}")
    ; Navigiert im Opitonen-Fenster zum Reiter "Embedded" und dort zum Button "Add"
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If ($vError==0) Then
    $Titel="Add New Toolchain"
    $Text="Enter the base"
    WinActivate($Titel, $Text)
    If Not (WinWaitActive($Titel, $Text)) Then
    $vError=1
    Else
    Send("C:\Programme\Microchip\xc8\v1.20\bin{TAB}{TAB}{TAB}{ENTER}")
    ; Gibt im Add-Fenster den Pfad zu xc8 an und Navigiert dann zum OK-Button
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    If ($vError==0) Then
    $Titel="Options"
    WinActivate($Titel)
    If Not (WinWaitActive($Titel)) Then
    $vError=1
    Else
    Send("{TAB}{TAB}{TAB}{TAB}{TAB}{TAB}{ENTER}")
    ; Navigiert zum OK-Button um Options zu schließen
    EndIf
    EndIf

    [/autoit][autoit][/autoit][autoit]

    $Titel="MPLAB X IDE v1.80"
    WinClose ($Titel)
    ; Schließt MPLAB X
    Sleep (10000)
    ; Falls MPLAB X nicht geschlossen wurde, wird Schließen erzwungen
    If WinExists ($Titel) Then
    WinKill ($Titel)
    EndIf

    [/autoit][autoit][/autoit][autoit]

    Blockinput(0)

    [/autoit][autoit][/autoit][autoit]

    Exit($vError)

    [/autoit]

    Bis zum Fenster "Options" geht das auch gut, aber dann sollte es eigentlich 5 mal nach rechts navigieren, also hab ich fünf mal {RIGHT} eingefügt. Es geht jedoch nur um einen Punkt nach rechts, dann passiert garnichts mehr. Das Skript wird im Tray noch angezeigt, macht aber nix mehr. Selbst wenn ich per Hand das nächste Fenster öffne, für das es Befehle hat (Add New Toolchain), passiert garnichts.
    Warum bricht es mittendrin ab? Was mache ich falsch? :S

    Schonmal vielen Dank für eure Hilfe :D
    LG Bowser

  • Hi,

    das mit den "send" Befehlen ist immer so eine Sache. Am besten probierst du alle "Send" Befehle in "ControlSend" umzuwandeln da muss das Fenster dann nicht durchgehend aktiv sein und trotzdem werden die Commands an das richtige Fenster geschickt. Des Weiteren empfehle ich für die Übersichtlichkeit mehrfacheingaben hintereinander zu verhindern. Du kannst als Beispiel auch {RIGHT 5} eingeben.

    Ich finde deine Befehle ein bisschen merkwürdig (kann aber auch sein weil ich relativ neu bin). Du arbeitest mit Klammern? Und ich weis aus C++ muss man Else-befehle der entsprechenden If Anweisung auch richtig zuweisen.

    Zudem habe ich die Erfahrung gemacht das wenn man ein Fenster aktiviert besser ein sleep einbaut.

    Grüsse
    AyKay

  • Send kann man schon benutzen, ist zwar sch*** aber egal ^^

    Du hast bei WinWaitActive kein Timeout angegeben, vielleicht wartet er da ewig. Allgemein kannst du in dein Script Msgbox(0,"","Line: etc") machen um zu sehen wie weit er kommt.

    Das hier:

    [autoit]

    WinActivate($Titel)
    If Not (WinWaitActive($Titel)) Then
    $vError=1
    Else

    [/autoit]

    Brauchst du auch denk ich nicht jedesmal machen, einmal am Anfang reicht.

    Ansonsten noch zu den Operatoren:

    Zitat

    = Tests if two values are equal. e.g. If $var= 5 Then (true if $var equals 5). Case insensitive when used with strings.

    Zitat

    == Tests if two strings are equal. Case sensitive. The left and right values are converted to strings if they are not strings already. This operator should only be used for string comparisons that need to be case sensitive

    Also in AutoIt kannst du auch = verwenden.

  • Moin.

    Ich hatte auch mal so ein Problem und ich habe dann eine Zeilezuvor "Sleep(250)" gepackt und es lief.

    Einfach mal das testen.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Hi,
    ja, Sleeps sind Gold wert!
    Btw. eine fehlerhafte Ausführung bei einer Zeile wie

    [autoit]

    Send("{ALT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{RIGHT}{ENTER}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{DOWN}{ENTER}")

    [/autoit]

    ist vorprogrammiert!
    Wie soll man das jemals debuggen?

    Send ist immer gut und schön, solange das Control an das etwas gesendet wird, die Sendung auch annimmt!
    Dazu muss das Control empfangsbereit sein.
    Ich habe aktuell eine spezialisierte Firmensoftware zu automatisieren, bei der empfangen einige Controls die Msg erst 500ms, nachdem sie sichtbar sind!
    Fenster sichtbar, Control sichtbar, aber Controlsend funktioniert erst eine halbe Sekunde später.....

  • Hallo,

    das mit den "send" Befehlen ist immer so eine Sache. Am besten probierst du alle "Send" Befehle in "ControlSend" umzuwandeln da muss das Fenster dann nicht durchgehend aktiv sein und trotzdem werden die Commands an das richtige Fenster geschickt. Des Weiteren empfehle ich für die Übersichtlichkeit mehrfacheingaben hintereinander zu verhindern. Du kannst als Beispiel auch {RIGHT 5} eingeben.

    Ich hätte erstmal ControlSend ausprobiert, aber da hat er jedesmal gemeckert:

    Code
    Line 13 (File "C:\....\AddXC8.au3"):
    
    
    ControlSend("{ALT}{RIGHT 9}{ENTER}{DOWN 6}{ENTER}")
    ^ ERROR
    
    
    Error: Incorrect number of parameters in function call.

    Dass das mit den Mehrfacheingaben auch einfacher funktioniert wusste ich nicht, aber wie du siehst hab ich es auch schon ausgebessert.

    Ich hab also erstmal wieder Send verwendet, dann ist er mir bei

    [autoit]

    Send("{RIGHT 5}{TAB 12}{ENTER}")

    [/autoit]

    erstmal um 3 nach rechts gesprungen anstatt um 5, hat einmal Tab gemacht und MPLABX hat sich geschlossen. Bei einem weiteren Versuch ohne etwas zu ändern ist er wie vorher um eins nach rechts gegangen und hat dann garnix mehr gemacht.

    Moin.

    Ich hatte auch mal so ein Problem und ich habe dann eine Zeilezuvor "Sleep(250)" gepackt und es lief.

    Einfach mal das testen.

    Also hab ich vor und nach die Zeile einfach mal Sleeps von jeweils einer Sekunde eingefügt, leider ohne irgendein Ergebnis. Er bleibt immer noch nach einem mal {RIGHT} hängen und macht nix mehr.

    LG Bowser

  • Hi,

    Zitat

    Also hab ich vor und nach die Zeile einfach mal Sleeps von jeweils einer Sekunde eingefügt, leider ohne irgendein Ergebnis. Er bleibt immer noch nach einem mal {RIGHT} hängen und macht nix mehr.

    du hast offensichtlich überhaupt nicht verstanden, wo das Problem ist...

    [autoit]

    Send("{RIGHT 5}{TAB 12}{ENTER}")

    [/autoit]

    ist per se suboptimal, siehe meinen obigen Post!
    Um herauszufinden wo es hängt, werden die Befehle EINZELN verwendet!

    [autoit]

    ;5x right
    for $i = 1 to 5
    Sleep(200)
    Send("{RIGHT}")
    ConsoleWrite("Send " & $i & @crlf)
    next

    [/autoit]

    Dann kann man auch debuggen....bspw. den Sleep je nach Bedarf ändern

  • Hilfe zu Conrolsend lesen!!!
    Und am besten die allgemeine zu Controls: Controls

    Verbindlichsten Dank. Da hätt ich auch selber draufkommen können, aber hab halt mal wieder nicht mitgedacht :wacko:

    du hast offensichtlich überhaupt nicht verstanden, wo das Problem ist...

    Da hast du offensichtlich recht, aber jetzt weis ich was du meinst

    Um herauszufinden wo es hängt, werden die Befehle EINZELN verwendet!

    [autoit]

    ;5x right
    for $i = 1 to 5
    Sleep(200)
    Send("{RIGHT}")
    ConsoleWrite("Send " & $i & @crlf)
    next

    [/autoit]

    Dann kann man auch debuggen....bspw. den Sleep je nach Bedarf ändern

    So klappts auf jeden Fall. Nur hab ich das jetzt bei den Tabs genauso gemacht:

    [autoit]

    ;12 mal Tab, navigiert zum Button "Add"
    for $i = 1 to 12
    Sleep(200)
    Send("{TAB}")
    ConsoleWrite("Send " & $i & @crlf)
    next
    Send("{ENTER}")

    [/autoit]


    aber er landet irgendwie bei jedem Durchlauf an einer anderen Stelle, an der er dann Enter drückt. Ich habs aber durchprobiert, wenn ich mit der Tastatur in das Optionen-Menü gehe, dann 5 mal rechts drücke um unter "Embedded" zu landen, dann bin ich genau in der Position um mit 12 mal Tab den "Add"-Button zu erreichen. Kann es sein dass das Script eine andere Default-Location hat für den Tastaturfokus :?:

    LG Bowser

  • Hi,

    Zitat

    Ich habs aber durchprobiert, wenn ich mit der Tastatur in das Optionen-Menü gehe, dann 5 mal rechts drücke um unter "Embedded" zu landen, dann bin ich genau in der Position um mit 12 mal Tab den "Add"-Button zu erreichen. Kann es sein dass das Script eine andere Default-Location hat für den Tastaturfokus

    Der Witz an der Schleife ist, dass man mit einer niedrigen Anzahl anfängt, und dann, wenn erfolgreich, den Zähler weiter erhöht!

    Am einfachsten ist es, alle SEND()´s untereinanderzuschreiben und nach jedem mit EXIT() das Script zu beenden, dann ist man halbwegs sicher, die richtigen Tastaturbefehle erwischt zu haben.

    [autoit]

    Sleep(200)
    Send("{TAB}")
    exit ;wenn erfolgreich, löschen
    Sleep(200)
    Send("{TAB}")
    exit ;wenn erfolgreich, löschen
    Sleep(200)
    Send("{TAB}")
    exit ;wenn erfolgreich, löschen
    Sleep(200)
    Send("{TAB}")
    exit ;wenn erfolgreich, löschen
    Sleep(200)
    Send("{TAB}")
    exit ;wenn erfolgreich, löschen
    ;uswusf

    [/autoit]
  • Hallo Andy,

    [autoit]

    for $i = 1 to 12

    [/autoit]


    sollte doch meiner Meinung nach ganz einfach bedeuten, dass er den Zähler $i nach jedem Schleifendurchlauf um 1 erhöht, ergo, die Schleife immer 12 mal durchläuft, oder hab ich da was falsch verstanden?

    Mit den 12 einzelnen Tabs klappts (natürlich ohne exit), aber das macht den Code halt recht unübersichtlich
    Und wenn 12 mal

    [autoit]

    Send("{TAB}")

    [/autoit]

    zur richtigen Stelle navigiert, warum tut

    [autoit]

    Send("{TAB 12}")

    [/autoit]

    das dann nicht? Laut Hilfe ist die Syntax richtig.
    Wenn das klappen würde wärs wesentlich übersichtlicher

    Edit: Mir ist auch noch aufgefallen, dass es häufig, aber nicht immer, ein einzelnes {RIGHT} oder {TAB} auslässt, wodurch ich häufig auf dem Cancel-Button lande, und wenn das Fenster erstmal zu ist macht auch AutoIt nichts mehr. Wenn ich jetzt aber, wie du vorgeschlagen hast, mithilfe von exit die schritte Schritt für Schritt abarbeite, passiert das nie

    LG Bowser

    2 Mal editiert, zuletzt von EbrithilBowser (4. Oktober 2013 um 10:23) aus folgendem Grund: Zusätzliche Informationen

  • Hi,

    Zitat

    Und wenn 12 mal
    Send("{TAB}")
    zur richtigen Stelle navigiert, warum tut
    Send("{TAB 12}")
    das dann nicht? Laut Hilfe ist die Syntax richtig.

    Frag das mal Herrn Gates und seine Zehntausende von Programmierern, die das Windows-Message-System entworfen haben....
    Eine "richtige Syntax" hat absolut nichts damit zu tun, ob externe Software deine Befehle auch genau so und in dieser Reihenfolge auswertet!
    Wenn du begriffen hast, WIE Windows überhaupt funktioniert (klick mich ich bin ein Link), dann wird das Send()-Gedöns wesentlich einfacher.

    Wenn du nach einigen Wochen der Lektüre des o.g. Links durchblickst, dann beantwortet sich deine Frage

    Zitat

    Wenn ich jetzt aber, wie du vorgeschlagen hast, mithilfe von exit die schritte Schritt für Schritt abarbeite, passiert das nie

    von selbst ;)

  • Hi Bowser,

    wenn du das mit den "Exit" dürchläufst und es da funktioniert liegt es vermutlich am sleep. Und wenn du dein Programm damit vollkleistern willst kannst du das wie oben gesagt über eine Schleife machen.

    Ein:

    [autoit]

    For $i = 1 To 12
    Send("{TAB}")
    sleep(200)
    Next

    [/autoit]


    Ist nicht das gleiche wie

    [autoit]

    Send("{TAB 12}")

    [/autoit]

    PS: Und wieso nochmal verwendest du nicht ControlSend?

    Gruss AyKay

  • Hi Bowser,
    PS: Und wieso nochmal verwendest du nicht ControlSend?

    Vermutlich deswegen:

    Zitat

    Da AutoIt Window Info in MPLAB X leider keine Controls erkennen kann, muss ich immer mit Tastaturbefehlen zu den jeweiligen Optionen navigieren.

    Da die Software aber eine IDE für Entwickler ist würde es mich schon sehr enttäuschen, wenn der Weg über eine GUI der einzige wäre um compiler oder Plugins hinzuzufügen. Ich würde daher mal die Dokumentation absuchen ob sowas auch durch kopieren von Dateien in dafür gedachte Verzeichnisse und ändern von config files der IDE machbar ist. Alternativ gibt es vielleicht auch ein cmdline Tool der IDE für diese Aufgabe. Im Zweifelsfall würde ich den Hersteller befragen ob es alternative Wege gibt bzw. was genau der dafür gedachte Wizzard eigentlich alles tut.

  • Hallo,

    Wenn du begriffen hast, WIE Windows überhaupt funktioniert (klick mich ich bin ein Link), dann wird das Send()-Gedöns wesentlich einfacher.

    Wenn du nach einigen Wochen der Lektüre des o.g. Links durchblickst, dann beantwortet sich deine Frage

    Ich werds mir mal durchlesen, aber das mit "einigen Wochen" schreckt mich schon ein bisschen ab. Ist ewas langfristig für mein Projekt.

    Zitat


    Ein:

    [autoit]

    For $i = 1 To 12
    Send("{TAB}")
    sleep(200)
    Next

    [/autoit]

    Ist nicht das gleiche wie

    [autoit]

    Send("{TAB 12}")

    [/autoit]

    Aber beide machen bei mir irgendwie nie genau 12 Tabs :(

    PS: Und wieso nochmal verwendest du nicht ControlSend?

    Weil ControlSend u.a. einen Text-Parameter erwartet, und ich nicht an jeder Stelle, an der ich Send verwende, ein Fenster mit reinem Text habe

    LG Bowser

    3 Mal editiert, zuletzt von EbrithilBowser (4. Oktober 2013 um 10:22)

  • Hi,

    Zitat

    Weil ControlSend u.a. einen Text-Parameter erwartet, und ich nicht an jeder Stelle, an der ich Send verwende, ein Fenster mit reinem Text habe

    hättest du das in den 1. Post geschrieben, hätte im 2. die Lösung dringestanden...

    Zu MPLAB X IDE, falls irgendein "Java"-Fan frustresitent ist, dann hat er mit diesem Programm (AutoIt-Steuerungstechnisch) viel Spass!

    //EDIT//
    Ich habe mal die ersten Schritte deines Scriptes in der MPLAB X IDE V1.9 nachvollzogen

    Spoiler anzeigen
    [autoit]

    WinActivate("MPLAB X IDE v1.9")
    WinWaitActive("MPLAB X IDE")
    Sleep(200) ;sicher ist sicher^^

    [/autoit] [autoit][/autoit] [autoit]

    Send("!t") ;alt+t Tools menü
    Sleep(200)
    Send("o") ;Optionen
    WinWaitActive("Options")
    Sleep(200)
    for $i = 1 to 5 ;Reiter Embedded
    Send("{RIGHT}")
    Sleep(500) ;java running, please upgrade hardware!
    Next
    Send("!d") ;alt d ADD
    WinWaitActive("Add New Toolchain")
    Sleep(200)
    Send("C:\Programme\Microchip\xc8\v1.20\bin"); Gibt im Add-Fenster den Pfad zu xc8 an und Navigiert dann zum OK-Button
    Sleep(200)
    Send("") ;code für OK-Button einfügen....

    [/autoit]

    Das funktioniert einwandfrei!
    Ich habe keinen weiteren Compiler/Assembler installiert (auf C:\ schonmal garnicht... ) daher hört der Spass für mich auch hier auf!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (30. September 2013 um 20:26)

  • Hallo Andy

    die direkten Sprünge zu den einzelnen Optionen sind eine sehr gute Idee. Wenn ich jedoch dein Skript ausführe, komm ich in den Optionen manchmal nur bis zum Reiter 4, C/C++, während Embedded der 5te Reiter ist. Die Schleife läuft also wieder zu selten durch.
    Bei einem anderen Versuch ist er bis ins "Add" fenster ohne Probleme gesprungen, doch dort musste ich in die Textzeile klicken, damit er den Text einfügt.
    Beide Fehler sind mir aus dem Code nicht ersichtlich und treten nur sporadisch auf, manchmal klappt auch alles

    Ich hoff jetzt einfach auf das Beste, hab nämlich auch nicht mehr viel Lust, da noch lang rumzubasteln. Vielen Dank an dich und alle anderen, die mir geholfen haben :rock:

    Was du mit dem Kommentar

    [autoit]

    ;java running, please upgrade hardware!

    [/autoit]

    meinst ist mir jedoch nicht ganz klar ?(

    LG Bowser

    Einmal editiert, zuletzt von EbrithilBowser (4. Oktober 2013 um 10:22)

  • Ich habe das Script mehrmals getestet, bei mir lief es jedenfalls "durch".

    Zitat

    Was du mit dem Kommentar
    ;java running, please upgrade hardware!
    meinst ist mir jedoch nicht ganz klar

    :D
    Na dann schau dir mal das Sleep(500) an, eine HALBE SEKUNDE warten, damit man sicher sein kann, dass "Java" es fertigbringt, nachdem ein Fenster sichtbar ist, die "Controls" (diese Bildchen in der obersten Zeile) anklickbar zu machen.
    Wenn ich mir jetzt noch vor Augen führe, dass der Code durch einen JiT-Compiler gejagt wird und somit nativ auf einem 3Ghz-Prozessor läuft, dann wage ich mir nicht mal ansatzweise vorzustellen, wieviel Ressourcen verballert werden, um eine GUI darzustellen :thumbdown: .

    Probiere mal, das sleep(200) VOR der For/To-Schleife auf 500 zu setzen und dieses und das in der Schleife zu erhöhen auf ggf 800....so lange, bis es klappt!

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    2 Mal editiert, zuletzt von Andy (3. Oktober 2013 um 19:32)

  • Mir scheint, sobald ich das ganze in eine .exe kompiliere, funktioniert es problemlos. Habs jetzt schon 5 mal getestet und es macht immer was es soll.
    Seltsam dass es als au3 noch nciht so flüssig lief

    Ich danke dir vielmals für deine Hilfe und kann die Sache endlich abhaken :D

    LG Bowser