Shell in Form anzeigen und nicht automatisch beenden

  • Allgemein

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Shell in Form anzeigen und nicht automatisch beenden

    Hallo!
    Ich möchte meinen Kommandozeilen Aufruf innerhalb meiner Form1 (oder einer neuen Form) umleiten und zudem verhindern, dass die Shell nach dem Ausführen des Kommandos geschlossen wird, damit ich evtl. vorhandene Rückmeldungen noch sehen kann.
    Bislang ganz profan:

    Quellcode

    1. p.StartInfo.FileName = MeineExeDatei
    2. p.StartInfo.Arguments = MeineParameterBlabla
    3. p.StartInfo.WindowStyle = ProcessWindowStyle.Normal
    4. p.Start()


    Hierbei wird ein neues Fenster geöffnet, der Prozess abgearbeitet und dann das neue Fenster geschlossen.
    Möchte also, dass der Prozess möglichst innerhalb meines Form1 angezeigt wird (Evtl. Textbox oder Panel?) und
    nach dem Abarbeiten weiterhin zu sehen bleibt.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MarcelBB“ ()

    Danke zunächst einmal.
    Ich habe da aber wohl etwas missverständlich geschrieben (wg. textbox). Ich möchte (zumindest zunächst) gar nicht mal den Stream auslesen, sondern einfach nur das Fenster, das sich öffnet, sobald der Prozess gestartet wird, nicht separat als neues Fenster haben, sondern dieses Fenster innerhalb meiner App sehen können, entweder in einem Feld-was auch immer auf dem Form1 oder zur Not in einem Form2, das dann aber nicht geschlossen wird, wenn der Befehl ausgeführt wurde, sondern offen bleibt.
    Du kannst mit der Api Funktion SetParent das ConsolenFenter jedem Control hinzufügen(auch Form's erben von Control), aber mit dem offenhalten fällt mir grad nichts ein. Was spricht denn dagegen, avrdude unsichtbar zu starten und den output zu verarbeiten?(ich ahne da was, xD, aber dafür wäre dann das mit CreateNoWindows genau das richtige) (...StartInfo.CreateNoWindow = true(muss dann aber .....StartInfo.UseShellexecute = false sein))
    pinvoke.net/default.aspx/user32.SetParent



    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Takafusa“ ()

    MarcelBB schrieb:

    aber nicht geschlossen wird, wenn der Befehl ausgeführt wurde, sondern offen bleibt.
    Das macht das Programm ganz allein.
    Wenn es sich selbst beendet, kannst Du es nicht offen halten.
    Probiere das mit dem Notepad aus.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Takafusa: Puh Repo forken? Das hört sich nach einer kleinen Lebensaufgabe an :)
    Zu der Anwendung: Ist ja klar das man damit ein Hex File auf einen Arduino Nano hochladen kann/soll.
    Dafür gibt es ja auch schon ganz gute Lösungen (z.B. das hervorragende AVRdudess)
    Aber in meinem Fall sollen die User eines kleinen Projekts (die kaum Ahnung von der Materie haben dürften) nicht durch die vielen Einstellmöglichkeiten verwirrt werden. Daher mache ich das ganz einfach und mit minimalen Settings. Leider schließt sich die Shell nach dem Ausführen des Befehls und so kann man nicht erkennen, ob oder was evtl. nicht geklappt hat.
    Per Stream das ganze auslesen und in ein Control reinhauen, wollte ich eigentlich nicht auch noch, denn der Ausgabebildschirm der Shell ist ja schon vorhanden. AVRdudess kann die Shell in der Form darstellen und schliesst sich auch nicht. Wenn es da keine einfache Möglichkeit gibt den offenzuhalten, muss ich mich halt daran machen... Habe ich halt null Erfahrung mit. Und wie immer kommt dann vermutlich ein Problem zum anderen.
    Also ohne weiteres wüsste ich nichts um das Fenster offenzuhalten, wenn du dieses meinst,
    github.com/zkemble/AVRDUDESS

    das ist glaub ich keine Console, sieht zwar so aus aber ich denke das eine gestylete TextBox mit Property Multiline auf True, oder RichTextBox.
    23 – Nichts ist so wie es scheint. :D
    Ich hab gerade eben beim schreiben dieses Posts mal flüchtig reingeschaut, dort wird auch der Output umgeleitet.

    C#-Quellcode

    1. Process tmp = new Process();
    2. tmp.StartInfo.FileName = binary;
    3. tmp.StartInfo.Arguments = args;
    4. tmp.StartInfo.CreateNoWindow = true;
    5. tmp.StartInfo.UseShellExecute = false;
    6. tmp.StartInfo.RedirectStandardOutput = true;
    7. tmp.StartInfo.RedirectStandardError = true;
    8. tmp.EnableRaisingEvents = true;
    9. if (outputTo == OutputTo.Memory)
    10. {
    11. tmp.OutputDataReceived += new DataReceivedEventHandler(outputLogHandler);
    12. tmp.ErrorDataReceived += new DataReceivedEventHandler(errorLogHandler);
    13. }
    14. tmp.Exited += new EventHandler(p_Exited);


    MarcelBB schrieb:

    Puh Repo forken? Das hört sich nach einer kleinen Lebensaufgabe an


    Ist in sekundenschelle gemacht.Fork = Gabel, in dem Sinne passt der Begriff Zweig eher. Ist wie kopieren(gabelung / neuer Zweig) und dran weiterarbeiten.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Takafusa“ ()

    MarcelBB schrieb:

    Leider schließt sich die Shell nach dem Ausführen des Befehls und so kann man nicht erkennen, ob oder was evtl. nicht geklappt hat.
    Statt eine Process-Instanz mit Deinem Code zu erstellen schreibe eine Batch-Datei mit Deinem Befehl und hänge hinten diese Zeile dran:
    Pause
    Diese Batch-Datei teste im Explorer, und wenn es läuft, pack sie in eine Process-Instanz.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!