2013-01-07 12 views
6

Eventuali duplicati:
How do I show console output/window in a forms application?Scrivendo uscita per la console da un'applicazione C# WinForms

C'è un modo per un programma C# WinForms di scrivere nella finestra di console?

+2

Bel post, ma è già stato chiesto qui: http://stackoverflow.com/questions/4362111/how-do-i-show-console-output-window-in-a-forms-application –

+1

@RobertHarvey: a meno che manchi qualcosa, quel post non risolve il problema di reindirizzamento ... – cedd

+0

Quale problema di reindirizzamento? Non hai detto nulla a riguardo nella tua domanda. Ah, vedo; hai auto-risposto. Bene, a meno che non ti aspetti ulteriori risposte dagli altri ... –

risposta

15

Ci sono fondamentalmente due cose che possono accadere qui.

  1. Console uscita

E 'possibile per un programma di WinForms per attaccarsi alla finestra della console che lo ha creato (o ad una finestra della console diversa, o addirittura a una nuova finestra di console se lo si desidera). Una volta collegato alla finestra della console, Console.WriteLine() ecc funziona come previsto. Un approccio a questo approccio è che il programma restituisce immediatamente il controllo alla finestra della console e quindi continua a scrivere su di esso, in modo che l'utente possa anche digitare nella finestra della console. Puoi usare start con il parametro/wait per gestire questo penso.

Link to start Command syntax

  1. console Redirect uscita

Questo è quando qualcuno tubi l'uscita dal programma qualche altra parte, ad esempio.

yourapp> file.txt

Collegamento ad una finestra di console in questo caso ignora efficacemente la tubazione. Per rendere questo lavoro è possibile chiamare Console.OpenStandardOutput() per ottenere un handle per lo streaming che l'output deve essere collegato a. Funziona solo se l'output è collegato, quindi se vuoi gestire entrambi gli scenari devi aprire lo standard output e scrivere ad esso e collegarlo alla finestra della console. Ciò significa che l'output viene inviato alla finestra della console e alla pipe ma è la soluzione migliore che ho trovato. Sotto il codice che uso per fare questo.

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

Grazie, questa è un'ottima soluzione! –

+0

È possibile leggere un'opzione della riga di comando per specificare se scrivere sullo standard output o sulla console – JoelFan