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?
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?
Ci sono fondamentalmente due cose che possono accadere qui.
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.
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);
}
}
Grazie, questa è un'ottima soluzione! –
È possibile leggere un'opzione della riga di comando per specificare se scrivere sullo standard output o sulla console – JoelFan
Bel post, ma è già stato chiesto qui: http://stackoverflow.com/questions/4362111/how-do-i-show-console-output-window-in-a-forms-application –
@RobertHarvey: a meno che manchi qualcosa, quel post non risolve il problema di reindirizzamento ... – cedd
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 ... –