Forum: PC-Programmierung C# Wie lese ich etwas ein?


von Kehrenkamp (Gast)


Lesenswert?

Guten Abend,

Ich wollte fragen ob jemand weiß wie man, eine Zeile aus einer breits 
ausgeführten (laufenden Prozess) Konsolenanwendung einließt?

Also z.B. Ich hab nen Hello World Programm was läuft und Hallo World 
ausgibt.
Nun möchte ich die Zeile mit einem neuen Programm Einlesen und auch 
ausgeben z.B..

Kann mir bitte einer helfen?

MfG

von Chris .. (dechavue)


Lesenswert?

Mittels der Klasse System.Diagnostics.Process kann man die 
Standardausgabe auf einen Stream Umleiten. Ich bin mir nicht sicher, 
aber ich glaube das Umleiten funktioniert nur wenn du den Prozess 
(mittels dieser Klasse) aus deinem Programm heraus startest.
Man kann sich zwar mittels der statischen Methoden der Process-Klasse in 
einen Laufenden Prozess reinhängen, allerdings muss man das Umleiten der 
Standardein-/Ausgabe in StartupInfo angeben. Daher meine Vermutung, dass 
es mit bereits laufenden Prozessen nicht funktioniert.

Wie man die Ausgabe von einem Laufenden Prozess umleiten kann weis ich 
leider auch nicht.

greets

von Kehrenkamp (Gast)


Lesenswert?

kann mir vielleicht einer ein beispiel bringen?

mfg

von Kehrenkamp (Gast)


Lesenswert?

Kann mir keiner helfen ?

von Chris .. (dechavue)


Lesenswert?

Weil ich heute gut gelaunt bin ;)
1
 
2
using System;
3
using System.Diagnostics;
4
using System.Windows.Forms;
5
namespace Test {
6
    class Form1 : Form {
7
        TextBox m_tbTest;
8
9
        public Form1() {
10
            m_tbTest = new TextBox();
11
            m_tbTest.Multiline = true;
12
            m_tbTest.Dock = DockStyle.Fill;
13
            Controls.Add(m_tbTest);
14
            //~~~~~~~~~~~~~~~~~~~~~~~~~~
15
            Process p = new Process();
16
            p.StartInfo.FileName = "Test.exe";
17
            p.StartInfo.RedirectStandardOutput = true;
18
            p.StartInfo.UseShellExecute = false;
19
            p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
20
            p.Start();
21
            p.BeginOutputReadLine();
22
        }
23
24
        private void p_OutputDataReceived(object sender, DataReceivedEventArgs e) {
25
            if (this.InvokeRequired) {
26
                this.BeginInvoke(new DataReceivedEventHandler(p_OutputDataReceived), sender, e);
27
            } else {
28
                m_tbTest.Text += e.Data + Environment.NewLine;
29
            }
30
        }    
31
        
32
        static void Main(string[] args) {
33
            Application.Run(new Form1());
34
        }
35
    }
36
}

Bei dem Beispiel muss das Zielprogramm aus diesem Programm heraus 
gestartet werden. Wie man von einem laufenden Prozess die 
Standardausgabe umleitet weis ich, wie bereits erwähnt, leider auch 
nicht.
Fallst du trotzdem in diese Richtung weiter recherchieren willst könnten 
dir Folgende Methoden hilfreich sein:
1
Process   p1    = Process.GetProcessById(...);
2
Process[] pArr1 = Process.GetProcesses();
3
Process[] pArr2 = Process.GetProcessesByName(...);

Damit kannst du dich an einen Laufenden Prozess ranhängen. Eventuell 
kannst du mittels WinAPI und dem hieraus erhaltenen Process-Handle die 
Standardausgabe auch nach dem Start noch umleiten.

greets

PS: In der Zwischenzeit hättest du ruhig ein wenig Eigeninitiative 
zeigen können: mit dem Stichwörtern Process+MSDN finden sich genaue 
Beschreibungen + Beispiele

von Johnny (Gast)


Lesenswert?

> Weil ich heute gut gelaunt bin ;)

Boah, sehr schönes Beispiel. Hoffe der Hilfesuchende weiss es ebenfalls 
zu schätzen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.