2013-01-07 13 views
6

Mögliche Duplizieren Schreiben Ausgabe:
How do I show console output/window in a forms application?an die Konsole aus einer C# WinForms-Anwendung

Gibt es eine Möglichkeit für ein C# WinForms-Programm in das Konsolenfenster zu schreiben?

+2

Nizza Post, aber es ist schon gefragt worden, hier: http://stackoverflow.com/questions/4362111/how-do-i-show-console-output-window-in-a-forms-application –

+1

@RobertHarvey: Wenn ich etwas nicht verpasse, adressiert dieser Beitrag nicht das Umleitungsproblem ... – cedd

+0

Welches Umleitungsproblem? Du hast darüber in deiner Frage nichts gesagt. Ah ich sehe; du hast selbst geantwortet. Nun, es sei denn, Sie erwarten zusätzliche Antworten von anderen ... –

Antwort

15

Es gibt grundsätzlich zwei Dinge, die hier passieren können.

  1. Console Ausgang

Es ist möglich, dass ein winforms Programm selbst Fenster an die Konsole zu befestigen, die es erstellt (oder zu einem anderen Konsolenfenster oder in der Tat zu einem neuen Fenster Konsole, falls gewünscht). Sobald es an das Konsolenfenster Console.WriteLine() angeschlossen ist, funktioniert es wie erwartet. Ein Ansatz zu diesem Ansatz ist, dass das Programm sofort die Kontrolle an das Konsolenfenster zurückgibt und dann weiter schreibt, so dass der Benutzer auch in das Konsolenfenster tippen kann. Sie können anfangen mit dem Parameter/wait, um damit umzugehen, denke ich.

Link to start Command syntax

  1. Weitergeleitet Konsolausgabe

Dies ist, wenn jemand Rohre der Ausgabe von Ihrem Programm woanders, zum Beispiel.

yourapp> file.txt

Anbringen an einem Konsolenfenster in diesem Fall ignoriert effektiv die Rohrleitungen. Um dies zu erreichen, können Sie Console.OpenStandardOutput() aufrufen, um eine Kennung für den Stream zu erhalten, an den die Ausgabe weitergeleitet werden soll. Dies funktioniert nur, wenn die Ausgabe piped ist. Wenn Sie also mit beiden Szenarien arbeiten möchten, müssen Sie die Standardausgabe öffnen und in das Konsolenfenster schreiben. Dies bedeutet, dass die Ausgabe an das Konsolenfenster und an das Rohr gesendet wird, aber es ist die beste Lösung, die ich finden konnte. Unterhalb des Codes verwende ich dies.

// This always writes to the parent console window and also to a redirected stdout if there is one. 
// It would be better to do the relevant thing (eg write to the redirected file if there is one, otherwise 
// write to the console) but it doesn't seem possible. 
public class GUIConsoleWriter : IConsoleWriter 
{ 
    [System.Runtime.InteropServices.DllImport("kernel32.dll")] 
    private static extern bool AttachConsole(int dwProcessId); 

    private const int ATTACH_PARENT_PROCESS = -1; 

    StreamWriter _stdOutWriter; 

    // this must be called early in the program 
    public GUIConsoleWriter() 
    { 
     // this needs to happen before attachconsole. 
     // If the output is not redirected we still get a valid stream but it doesn't appear to write anywhere 
     // I guess it probably does write somewhere, but nowhere I can find out about 
     var stdout = Console.OpenStandardOutput(); 
     _stdOutWriter = new StreamWriter(stdout); 
     _stdOutWriter.AutoFlush = true; 

     AttachConsole(ATTACH_PARENT_PROCESS); 
    } 

    public void WriteLine(string line) 
    { 
     _stdOutWriter.WriteLine(line); 
     Console.WriteLine(line); 
    } 
} 
+0

Danke, das ist eine großartige Lösung! –

+0

Sie könnten eine Befehlszeilenoption lesen, um anzugeben, ob auf die Standardausgabe oder die Konsole geschrieben werden soll – JoelFan

Verwandte Themen