1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Domi78

Beiträge von Domi78

  • Ausgabe in DOS-Fenster umleiten

    • Domi78
    • 17. Februar 2020 um 12:01

    Okay, der Switch war mir komplett neu. Leider funktioniert das bei mir auch nicht, aber die #AutoIt3Wrapper-Befehle haben bei mir noch nie funktioniert.

    Das schöne an Deinem Change2CUI ist, dass man nicht jede ConsoleWrite-Funktion umbenennen muss. Nicht so schön ist, dass man dann immer das DOS-Fenter hat und bei mir nur die Ausgabe umgeleitet wird, wenn man die exe aus CMD mit "/cmd" startet.

    Mit dem Keyword hab ich folgenden Post gefunden: Debug mit Change2CUI

    Der User veronesi hatte vor 8 Jahren das selbe Problem und hat es genauso gelöst wie ich. ^^

    Bisher hatte ich bei meinen Recherchen nur User mit dem Problem gefunden und die Nicht funktionierenden Vorschläge mit StdoutRead, StdinWrite oder ControlSend.

  • Ausgabe in DOS-Fenster umleiten

    • Domi78
    • 17. Februar 2020 um 10:58

    Hallo BugFix,

    die Funktion ist hauptsächlich für Programme nach dem Kompilieren gedacht. Im Editor funktioniert das ja auch alles einwandfrei und man benötigt die Umleitung nicht, da die STD-Ausgabe ja unten im Editor angezeigt wird.

    Wenn man aber das Skript kompiliert hat und es von CMD (oder aus einer Batch- oder Command-Datei) ausführt, hat man den Editor nicht mehr. ConsoleWrite() läuft dann ins leere und eventuell nützliche Informationen gehen dann verloren.

    Man kann jetzt das Script zwar als DOS-Programm kompilieren, um wieder die STD-Anzeige in der Command zu sehen, kann dann aber keine GUI-Elemente mehr nutzen.

    Ich nutze es für alles, was mit Batch-Dateien anfängt, anschließend mit AutoIt weiter läuft und dann wieder zu Batch zurückkehrt.

    Zum Beispiel kopiere ich während der Ausführung einer Batch einige Dateien, die manchmal umbenannt werden müssen. Das komplett in Batch zu machen ist nicht möglich, da die Umbenennung zu kompliziert ist und die vorhandene Batchdatei umzuschreiben ist zu aufwändig. Also mach ich eine kleine exe und füge diese in die Batch-Datei ein. Ob der Kopiervorgang erfolgreich war, ist dann im CMD-Fenster zu erkennen und bei zu komplexen Umbenennungen wird der User per GUI gefragt.

  • Ausgabe in DOS-Fenster umleiten

    • Domi78
    • 17. Februar 2020 um 10:00

    Hallo liebe Community,

    nach einigen Versuchen habe ich festgestellt, dass es nicht möglich ist, mit ConsoleWrite() die Ausgabe auf die Eingabeaufforderung umzuleiten, ohne das Programm als DOS-Programm zu kompilieren.
    Außerdem ruft man das Programm ja nicht immer unbedingt aus einem Batch-Script auf, sondern startet es manchmal direkt oder aus dem Editor. Eine geeignete Lösung wie man den STD-Output umlenken kann habe ich nicht gefunden, nur hat mir das nicht gereicht.

    Das ist dabei rausgekommen und ich hoffe, dass es für den einen oder anderen von euch nützlich ist. Inkludiert die angehängte AU3 in eurem Script und ersetzt den Befehl "ConsoleWrite()" durch "Output()":

    Code
    #include "C:\Path\to\File\Output.au3"
    
    Output("Hallo Welt" & @CRLF)

    Wenn Ihr das Programm dann mit "/cmd" startet, wird die Ausgabe umgeleitet.
    Der Parameter "/MsgBox" zeigt Message-Boxen an, falls mal was zum debuggen sein sollte und "/NoSciTE" deaktiviert die Ausgabe im Editor.

    Mit "/file" lässt sich die Ausgabe auch in eine Datei umleiten. Die Parameter sind natürlich auch kombinierbar.

    Dateien

    Output.au3 2,22 kB – 398 Downloads
  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 17. Mai 2019 um 21:40

    Hi, nochmal kurz als Abschluss für dieses Thema und zur Vervollständigung (und für jeden, der das Problem auch mal haben sollte):

    Wenn Ihr unbedingt keine Trennzeile haben möchtet, aber trotzdem ein Untermenü direkt darüber oder darunter haben möchtet, ist das auch möglich. Dazu muss nur diese Option gesetzt werden:

    Code
    AutoItSetOption("TrayMenuMode", 8)

    Achtet dann aber darauf, dass die Radiobuttons nicht mehr automatisch umgeschaltet werden. Ihr müsst das dann selbst in euer Skript für jeden Radiobutton einzeln einprogrammieren.

    Der Grund ist der, da bei der Erstellung eines Radiobuttons die Zeile darüber und darunter überprüft wird, ob es auch ein Radiobutton ist. Nur so können automatisch Gruppen erstellt werden, zwischen denen der ausgewählte Radiobutton hoch und runter springen kann. Als Abgrenzung der Gruppen dienen Trennlinien (oder normale Einträge), jedoch keine Untermenüs, da diese sonst den Fehler verursachen. Nutzt man die oben angegebene Einstellung, werden keine automatischen Gruppen erstellt und man muss den Klick entsprechend selbst auswerten.

    Code
    AutoItSetOption("TrayAutoPause", 0)
    AutoItSetOption("TrayMenuMode", 8)
    AutoItSetOption("TrayOnEventMode", 1)
    Global $aTrayArray[2][7]   ; Variable wird hier leer deklariert. In der Funktion wird sie mit Text neu deklariert.
    InitTray()
    While True
       ConsoleWrite("Ich warte ..." & @CRLF)
       Sleep(10000)
    WEnd
    
    Func InitTray()
       Global $aTrayArray[2][7] = [[], ["Text 1", "Text 2", "Text 3", "Text 4", "Text 5", "Text 6", "Text 7"]]
       $aTrayArray[0][0] = TrayCreateItem($aTrayArray[1][0], -1, -1, 1)
       $aTrayArray[0][1] = TrayCreateItem($aTrayArray[1][1], -1, -1, 1)
       $aTrayArray[0][2] = TrayCreateItem($aTrayArray[1][2], -1, -1, 1)
       Local $iTraySettings = TrayCreateMenu("Untermenü")
       $aTrayArray[0][3] = TrayCreateItem($aTrayArray[1][3], $iTraySettings)
       $aTrayArray[0][4] = TrayCreateItem($aTrayArray[1][4], $iTraySettings)
       $aTrayArray[0][5] = TrayCreateItem($aTrayArray[1][5], $iTraySettings)
       $aTrayArray[0][6] = TrayCreateItem($aTrayArray[1][6])
       For $i = 0 To UBound($aTrayArray, 2) - 1
          TrayItemSetOnEvent($aTrayArray[0][$i], "CallTray")
       Next
    EndFunc
    
    Func CallTray()            ; Darf nur durch TrayItemSetOnEvent() aufgerufen werden
       Local $iTrayItem = -1
       For $i = 0 To UBound($aTrayArray, 2) - 1
          If @TRAY_ID = $aTrayArray[0][$i] Then $iTrayItem = $i
       Next
       Switch $iTrayItem
       Case 0
          TrayItemSetState($aTrayArray[0][0], 1+128)   ; Wählt 1. Menüpunkt aus und deaktiviert ihn
          TrayItemSetState($aTrayArray[0][1], 4+64)    ; Aktiviert 2. Menüpunkt
          TrayItemSetState($aTrayArray[0][2], 4+64)    ; Aktiviert 3. Menüpunkt
       Case 1
          TrayItemSetState($aTrayArray[0][0], 4+64)    ; Aktiviert 1. Menüpunkt
          TrayItemSetState($aTrayArray[0][1], 1+128)   ; Wählt 2. Menüpunkt aus und deaktiviert ihn
          TrayItemSetState($aTrayArray[0][2], 4+64)    ; Aktiviert 3. Menüpunkt
       Case 2
          TrayItemSetState($aTrayArray[0][0], 4+64)    ; Aktiviert 1. Menüpunkt
          TrayItemSetState($aTrayArray[0][1], 4+64)    ; Aktiviert 2. Menüpunkt
          TrayItemSetState($aTrayArray[0][2], 1+128)   ; Wählt 3. Menüpunkt aus und deaktiviert ihn
       EndSwitch
       MsgBox(0, "DEBUG", "Funktioniert")
    EndFunc
    Alles anzeigen

    So lange man aber nicht gerade besonders komplexe Radiobuttons haben möchte, empfehle ich eher die Verwendung der Trennlinie...

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 10. Mai 2019 um 09:10

    OMG... Ich geh in die Ecke und schäme mich... :Face:

    Aus der Hilfe:

    Zitat

    Radio menuitems are automatically grouped together and these groups are separated by a separator line or a normal item which is not a radio item.

    Ich danke euch allen trotzdem für eure Unterstützung.

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 10. Mai 2019 um 08:52

    Guten Morgen,

    Danke Tuxedo für Deinen Versuch. Ich habe Dein Script kopiert, die Kommentarzeilen und die MsgBoxen entfernt und getestet. Es ist gleich beim ersten mal in den Fehler gelaufen.

    Zitat von Tuxedo

    wenn bei der letzten Zeile statt der 0 eine 1 eingefügt wird gibts auch Fehler.

    Das deutet darauf hin, dass die Radiobuttons (die ja durch das "-1, -1, 1" aktiviert werden) Probleme damit haben, wenn unter ihnen ein Untermenü definiert ist. Das Einfügen einer Trennzeile löst das Problem.

    Hier der Code, der bei mir funktioniert (20 Tests ohne Absturz):

    Code
    AutoItSetOption("TrayAutoPause", 0)
    AutoItSetOption("TrayOnEventMode", 1)
    Global $aTrayArray[2][7] = [["Text 1", "Text 2", "Text 3", "Text 4", "Text 5", "Text 6", "Text 7"], []]
    InitTray()
    While True
       ConsoleWrite("Ich warte ..." & @CRLF)
       Sleep(3000)
    WEnd
    Func InitTray()
       $aTrayArray[1][0] = TrayCreateItem($aTrayArray[0][0], -1, -1, 1)
       $aTrayArray[1][1] = TrayCreateItem($aTrayArray[0][1], -1, -1, 1)
       $aTrayArray[1][2] = TrayCreateItem($aTrayArray[0][2], -1, -1, 1)
       TrayCreateItem("")
          Local $iTraySettings = TrayCreateMenu("Untermenü")
          $aTrayArray[1][3] = TrayCreateItem($aTrayArray[0][3], $iTraySettings)
          $aTrayArray[1][4] = TrayCreateItem($aTrayArray[0][4], $iTraySettings)
          $aTrayArray[1][5] = TrayCreateItem($aTrayArray[0][5], $iTraySettings)
       $aTrayArray[1][6] = TrayCreateItem($aTrayArray[0][6])
       For $i = 0 To 6
          TrayItemSetOnEvent($aTrayArray[1][$i], "CallTray")
       Next
    EndFunc
    Func CallTray()
       MsgBox(0, "DEBUG", "Funktioniert")
    EndFunc
    Alles anzeigen
    Zitat von Tuxedo

    wenn ich die Globale Variable in der Funktion so deklariere wie ich es in der auskommentierten Zeile stehen habe...

    Dann definierst Du $iTraySettings und erzeugst gleichzeitig das Untermenü als Eintrag ganz oben. Du könntest $iTraySettings aber zuerst global nur definieren (leer lassen) und später dann nur füllen, aber $iTraySettings wird ja nur benötigt, um das Untermenü anzulegen. Daher muss das keine globale Variable sein (im Gegensatz zum Array, welches die ID speichert und später beim klicken abgefragt werden muss).

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 9. Mai 2019 um 22:00

    Okay, das hat sich bei mir jetzt auch so gezeigt. Wenn ich die Optionen anklickbar mache, funktioniert alles normal.

    Man muss sich also entscheiden, ob man Radiobuttons möchte oder Untermenüs. Wenn man beides kombiniert, rennt man in einen Programmfehler rein.

    Das heißt, das vom Coding her (den Fauxpas mit der globalen Variable vergessen wir mal ganz schnell) also alles ganz okay war, wenn ich das richtig verstehe.

    Okay, dann bedank ich mich noch recht freundlich bei Dir, Amaterasu ;)

    Wenn das Programm fertig ist und läuft, schau ich mir mal den BugTracker an. Momentan will ich erstmal noch ein bischen geübter werden.

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 9. Mai 2019 um 20:23

    Okay, ich hab nochmal rumprobiert und den Fehler entdeckt.

    Hier hab ich sogar den EventMode deaktiviert:

    Code
    AutoItSetOption("TrayAutoPause", 0)
    
    $idItem1 = TrayCreateItem("Text 1", -1, -1, 1)
    TrayCreateMenu("Untermenü")
    $idItem2 = TrayCreateItem("Text 2", -1, -1, 1)
    
    While True
       Switch TrayGetMsg()
       Case $idItem1, $idItem2
          CallTray()
       EndSwitch
       ConsoleWrite("Ich warte ..." & @CRLF)
       Sleep(1000)
    WEnd
    
    Func CallTray()
       MsgBox(0, "DEBUG", "Funktioniert")
    EndFunc
    Alles anzeigen

    Das Problem besteht immer noch. Also lag es nicht wie vermutet am "TrayOnEventMode" oder am TrayItemSetOnEvent() sondern es liegt am TrayCreateMenu().

    Ich bin jetzt nochmal alle Versionen die ich probiert hab und bei denen der Fehler aufgetreten ist durchgegangen. Wenn ich TrayCreateMenu() nicht verwende, sondern mit TrayCreateItem("") eine Trennzeile erzeuge, funktioniert alles perfekt.

    Das Problem ist eigendlich noch nicht gelöst, aber so kann ich zumindest weiter machen. Der Rest ist ja rein optisch.

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 9. Mai 2019 um 17:33

    Ich dachte mir, innerhalb der Funktion bleibt mein globaler Scope übersichtlicher. Mit dem setzen der Globalen Variable hast Du natürlich recht. Wenn global, muss sie auch immer und überall lesbar sein und nicht erst, wenn die Funktion aufgerufen wird.

    Den Code hab ich jetzt nach oben verschoben und getestet. Funktioniert problemlos. Beim dritten Versuch aber der Rückschlag. Das Script läuft nach wie vor ab und zu in den Exit code 3221225477.

    Hier mein aktueller Versuch:

    Code
    AutoItSetOption("TrayAutoPause", 0)
    AutoItSetOption("TrayOnEventMode", 1)
    
    TrayCreateItem("Text 1", -1, -1, 1)
    TrayItemSetOnEvent(-1, "CallTray")
       TrayCreateMenu("Untermenü")
    TrayCreateItem("Text 2", -1, -1, 1)
    TrayItemSetOnEvent(-1, "CallTray")
    
    While True
       ConsoleWrite("Ich warte ..." & @CRLF)
       Sleep(3000)
    WEnd
    
    Func CallTray()
       MsgBox(0, "DEBUG", "Funktioniert")
       Exit
    EndFunc
    Alles anzeigen

    Edit 1: Habe das Array um eine Dimension gekürzt und die For-Schleife entfernt - Fehler tritt immer noch (wie auch vorher schon) ab und zu auf.

    Edit 2: Habe das Array jetzt komplett rausgeschmissen und definiere überhaupt keine Variablen mehr. Obwohl ich noch mehr gekürzt hab, taucht der Fehler immer noch auf (ca. 50% der runs).

    Hoffentlich nehmt Ihr es mir nicht übel, dass ich den Beitrag jetzt schon zum zweiten mal editiert hab.

  • Exit code 3221225477 bei TrayCreateMenu()

    • Domi78
    • 9. Mai 2019 um 15:00

    Hallo Comunity,
    nach ein paar Tagen, die ich mit AutoIt verbracht habe (und meinen ersten Programmen und Problemen, die ich alle selbsständig lösen konnte), habe ich nun ein Problem, bei dem mir weder die Online-Hilfe, noch der Debugger weiterhelfen konnte.

    Mein Programm möchte ich möglichst klein halten und habe mich daher gegen eine GUI entschieden. Die entsprechenden Konfigurationen möchte ich über das Tray-Symbol ändern und zwar während der Laufzeit.

    Leider funktioniert das nur manchmal, wobei es egal ist, ob man Das Programm direkt ausführt oder zuerst kompiliert.

    Wenn man das Programm startet, funktioniert es entweder immer oder es stürzt beim Auswählen des Menüpunkts ab. Den Sourcecode hab ich kopiert und auf den fehlererzeugenden Code reduziert:

    Code
    AutoItSetOption("TrayAutoPause", 0)
    AutoItSetOption("TrayOnEventMode", 1)
    InitTray()
    While True
       ConsoleWrite("Ich warte ..." & @CRLF)
       Sleep(3000)
    WEnd
    
    Func InitTray()
       Global $aTrayArray[2][7] = [["Text 1", "Text 2", "Text 3", "Text 4", "Text 5", "Text 6", "Text 7"], []]
       $aTrayArray[1][0] = TrayCreateItem($aTrayArray[0][0], -1, -1, 1)
       $aTrayArray[1][1] = TrayCreateItem($aTrayArray[0][1], -1, -1, 1)
       $aTrayArray[1][2] = TrayCreateItem($aTrayArray[0][2], -1, -1, 1)
          Local $iTraySettings = TrayCreateMenu("Untermenü")
          $aTrayArray[1][3] = TrayCreateItem($aTrayArray[0][3], $iTraySettings)
          $aTrayArray[1][4] = TrayCreateItem($aTrayArray[0][4], $iTraySettings)
          $aTrayArray[1][5] = TrayCreateItem($aTrayArray[0][5], $iTraySettings)
       $aTrayArray[1][6] = TrayCreateItem($aTrayArray[0][6])
       For $i = 0 To 6
          TrayItemSetOnEvent($aTrayArray[1][$i], "CallTray")
       Next
    EndFunc
    
    Func CallTray()
       MsgBox(0, "DEBUG", "Funktioniert")
    EndFunc
    Alles anzeigen

    Es scheint so, als ob TrayItemSetOnEvent() die entsprechende Funktion nicht immer finden kann.

    Ich hoffe, Ihr könnt mir sagen, was ich falsch mache. Vielen Dank schon mal im Vorraus.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™