Laden...

Konsole (cmd) aus Windows Forms Anwendung auslesen - GUI hängt

Erstellt von VBMichi vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.280 Views
V
VBMichi Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren
Konsole (cmd) aus Windows Forms Anwendung auslesen - GUI hängt

Hi,

ich möchte die Konsole im Hintergrund ausführen um einen Download über das Konsolenprogramm "rtmpdump" zu realisieren.
Wenn ich rtmpdump händisch über die Konsole starte und einen entsprechenden Link mitliefere, wird gedownloaded. Der aktuelle Fortschritt (in %) wird am Ende des Konsolenfensters angezeigt. Das soll jetzt automatisiert geschehen und der aktuellen Fortschritt in % soll auf einer Form erscheinen.

Ein Konsolenfenster im Hintergrund starte ich derzeit so:

System.Diagnostics.Process myProc = new System.Diagnostics.Process();

myProc.StartInfo.FileName = Environment.GetEnvironmentVariable("COMSPEC");
            myProc.StartInfo.CreateNoWindow = true;
            myProc.StartInfo.RedirectStandardInput = true;
            myProc.StartInfo.RedirectStandardOutput = true;
            myProc.StartInfo.UseShellExecute = false;

            myProc.Start();

Jetzt erstelle ich einen Reader und Writer um in das Konsolenfenster zu schreiben und es auszulesen:

System.IO.StreamWriter myWriter;
System.IO.StreamReader myReader;

myWriter = myProc.StandardInput;
myWriter.AutoFlush = true;

Dann setzte ich die Befehle (dlString ist ein string mit einem Aufruf von rtmpdump.exe und einem Downloadpfad) in der Konsole ab:

myWriter.WriteLine("ECHO ON");
myWriter.WriteLine("cd bib");
myWriter.WriteLine(dlString);

Soweit funktioniert - scheinbar - alles. Zonealarm meldet sich und frägt ob rtmpdump.exe in das Internet kommunizieren darf.

Und nun möchte ich die Konsole alle paar Sekunden komplett mit dem Reader auslesen, und hier klemmts. Ich versuche es im Moment so:

myReader = myProc.StandardOutput;
string tmp = "";
tmp = myReader.ReadToEnd();

tmp = System.Text.Encoding.GetEncoding(850).GetString(System.Text.Encoding.Default.GetBytes(tmp));

MessageBox.Show(tmp);

Wenn ich den letzten Teil ausführe hängt die komplette Form.. liegt das irgendwie an dem ReadToEnd() ? Wenn ich beim Writer noch ein "WriteLine("EXIT")" dranhänge, dann funktioniert es, aber nur EINMAL. Und gedownloaded wird auch nix. Bin ratlos 🤔

Vielleicht weiß ja jemand weiter?!

LG,
Micha

4.221 Beiträge seit 2005
vor 12 Jahren

Schau Dir dies mal an.

Console als Steuerelement einbinden.

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

V
VBMichi Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren

Hi,

danke für die super Vorlage.
Leider wirft die Klasse bei mir eine Exception, hab ich sie falsch eingebunden?

VirtualConsole myConsole = new VirtualConsole();

myConsole.Left = 5;
myConsole.Top = 5;
myConsole.Height = 100;
myConsole.Width = 200;

myConsole.Show();
myConsole.Visible = true;

In der Zeile:

if (s != string.Empty)
{
     this.Invoke(new AddStringDelegate(this.AddString), new object[] { s, addNewLine });
}

wird die Exception

Fehlermeldung:
Invoke oder BeginInvoke kann für ein Steuerelement erst aufgerufen werden, wenn das Fensterhandle erstellt wurde.

geworfen. Das gleiche Problem hatte auch schon jemand anderes in dem von dir bereitgestellten Thread.

VG

4.221 Beiträge seit 2005
vor 12 Jahren

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

V
VBMichi Themenstarter:in
28 Beiträge seit 2007
vor 12 Jahren

Alles klar, jetzt wirft das ganze zumindest keine Exception mehr.
Habe im Konstruktor des Controls, über base, das Handle erstellt.

Nur erscheinen tut die ConsolenBox noch immer nicht. Ist der Aufruf in meinem vorherigen Post korrekt?

Danke & LG

EDIT: Dummer Fehler. Habe vergessen dem Control das Parent zuzuweisen. Jetzt klappt alles. Werde mal damit arbeiten und mich ggf. wieder melden.
Vielen herzlichen Dank für die Unterstützung!

R
100 Beiträge seit 2009
vor 12 Jahren

@VBMichi: Kannst du schon die Konsole Ausgabe von rtmpdump lesen? Ich versuche mal auch die Ausgabe von rtmpdump zu lesen aber es klappt aber noch nicht.
Eingabe:
rtmpdump.exe -r rtmp://gffstream.fcod.llnwd.net/a792/e2/tv/rockpalast/live/2010/haldern10_feine_kleine_dorfmusik.mp4 -o output.mp4

Ausgabe:
Bitte siehe Anhang.

Diese Ausgabe kann ich nicht auslesen. Die OutputDataReceived gibt nichts raus nachdem rtmpdump wird aufgerufen.