2013-01-07 14 views
6

Powiel możliwe:
How do I show console output/window in a forms application?Pisanie wyjścia do konsoli z aplikacji C# WinForm

Czy istnieje sposób dla C# WinForm programu do zapisu w oknie konsoli?

+2

Nicea postu, ale to już tutaj pytanie: http://stackoverflow.com/questions/4362111/how-do-i-show-console-output-window-in-a-forms-application –

+1

@RobertHarvey: O ile czegoś mi nie brakuje, ten wpis nie rozwiązuje problemu przekierowania ... – cedd

+0

Jaki problem z przekierowaniem? Nie powiedziałeś nic na ten temat w swoim pytaniu. O, rozumiem; odpowiedziałeś sam. Cóż, chyba że oczekujesz dodatkowych odpowiedzi od innych ... –

Odpowiedz

15

Są dwie rzeczy, które mogą się tutaj wydarzyć.

  1. Console wyjście

Możliwe jest program winforms aby dołączyć się do okna konsoli, który go stworzył (lub do innego okna konsoli, czy rzeczywiście w nowym oknie konsoli w razie potrzeby). Po dołączeniu do okna konsoli, Console.WriteLine() itd. Działa zgodnie z oczekiwaniami. Jednym z podejść do tego podejścia jest to, że program natychmiast zwraca kontrolę do okna konsoli, a następnie kontynuuje pisanie do niego, aby użytkownik mógł również wpisać tekst w oknie konsoli. Możesz użyć polecenia start z parametrem/wait, aby sobie z tym poradzić.

Link to start Command syntax

  1. Przekierowano konsola wyjście

To jest, gdy ktoś rury wyjście z programu w innym miejscu, np.

yourapp> plik.txt

Mocowanie do okna konsoli w tym przypadku skutecznie ignoruje orurowania. Aby to zadziałało, możesz wywołać Console.OpenStandardOutput(), aby uzyskać uchwyt do strumienia, do którego dane wyjściowe powinny być przesyłane. Działa to tylko wtedy, gdy wyjście jest wyprowadzone, więc jeśli chcesz obsłużyć oba scenariusze, musisz otworzyć standardowe wyjście i napisać do niego i dołączyć do okna konsoli. Oznacza to, że dane wyjściowe są wysyłane do okna konsoli i do rury, ale jest to najlepsze rozwiązanie, jakie mogłem znaleźć. Poniżej kodu używam, aby to zrobić.

// 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

Dzięki, to jest świetne rozwiązanie! –

+0

Można odczytać opcję wiersza polecenia, aby określić, czy pisać na standardowe wyjście, czy na konsolę – JoelFan