C# Auslesen von Daten von einem Fremdprogramm

derbe

Lt. Commander
Registriert
Aug. 2013
Beiträge
1.701
Hallo,

ich möchte mir Werte ziehen von einen anderen Programm welches Daten anzeigt (in einem Fenster ähnlich wie CMD), wie kann ich das in einem C# Programm umsetzen?
 
Zuletzt bearbeitet:
Was dir hier helfen sollte ist: RedirectStandardOutput
Also externes Programm aus C# heraus starten und das entsprechende Flag in der Startinfo setzen. Dann kannst Du den Output parsen.
Google einfach mal danach dann sollten sich einige Beispiele finden.
 
bif81 schrieb:
Was dir hier helfen sollte ist: RedirectStandardOutput
Also externes Programm aus C# heraus starten und das entsprechende Flag in der Startinfo setzen. Dann kannst Du den Output parsen.
Google einfach mal danach dann sollten sich einige Beispiele finden.

Ich dachte das würde nur für CMD gehen? Geht das auch mit "jedem" anderen Programm?
 
Ja geht nur für console programme. Ich hab das "ähnlich" überlesen. Dachte es ist ein normales console prog. Wenn Du keinen Output hast, wirst Du auch nichts parsen können. Gibt es evtl eine api zu dem Prog? Dann würde ich es damit probieren. Sonst sehe ich da schwarz.
 
Man könnte es noch mit OCR probieren. Wenn es konsolenähnlich ist sollte das ja auch relativ zuverlässig funktionieren.
 
Das geht recht einfach:
Code:
using System;
using System.Diagnostics;
using System.IO;

class Program {
    static void Main() {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = @"C:\MeinProgram.exe";
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start)) {
            // Lesen allen Text from Process und gib ihn in der Console aus (als Beispiel)
            using (StreamReader reader = process.StandardOutput) {
                string result = reader.ReadToEnd();
                Console.Write(result);
            }
        }
    }
}
 
Ich werde es heute Abend mal testen, danke. OCR wäre auch ne Möglichekeit würde es allerdings gerne "sauber" lösen.

€: Um es nochmal klar zu stellen, es "sieht" optisch aus wie ein CMD Programm (Dosbox).
Ist allerdings eine "normale" exe Datei.
 
derbe schrieb:
€: Um es nochmal klar zu stellen, es "sieht" optisch aus wie ein CMD Programm (Dosbox).
Ist allerdings eine "normale" exe Datei.
xD

Das mit dem Umleiten klappt soweit ich weiß nur, wenn man das Konsolenfenster auch direkt startet. Aus deinem vorherigen Thread (der sich jetzt im Aquarium befindet) ging hervor, dass dieses aber von einem anderen Programm aufgerufen wird. Falls du irgendwelche Parameter angeben kannst, lass dir die Ausgabe in eine Datei umleiten.

Ansonsten: ReadProcessMemory
In C++ zumindest (ja kenne mich in C# nicht wirklich aus) kann man damit zumindest auf den Speicher anderer Anwendungen zugreifen. Google spuckt da aber auch etwas im Zusammenhang mit C# aus.
 
S.Kara schrieb:
xD

..
Ansonsten: ReadProcessMemory
In C++ zumindest (ja kenne mich in C# nicht wirklich aus) kann man damit zumindest auf den Speicher anderer Anwendungen zugreifen. Google spuckt da aber auch etwas im Zusammenhang mit C# aus.


Also es das andere "Programm" wird schon von der C# Anwendung gestartet, um es dann auszulesen. Das stimmt schon. Ich habe auch schon ne ganze Weile in Suchmachinen verbracht um das Problem zu lösen denke mir fehlen da wohl ehr die "Fachbegriffe". Zudem habe ich jetzt paar Lösungsansätze, die werde ich mal versuchen. Und werde berichten falls etwas davon für mich funktioniert.
 
Das RedirectStandardOutput klappt immer dann, wenn die Anwendung auf STDOUT schreibt (beispielsweise über printf, oder Console.log).
ReadProcessMemory klappt in C# genauso, ist aber extrem aufwendig und anfällig, da Du die Speicherstruktur des fremden Programmes kennen und interpretieren musst.

Für genauere Infos müsste man wissen, ob welches Programm es genau geht (Dosbox?). Eventuell sind nämlich Kommandozeilenparameter verfügbar, die explizit die Info-Ausgabe auf STDOUT aktivieren.
 
@ lynxx

Danke habe es nun eingebaut läuft 1a! Top!
 
Zurück
Oben