Redireccionando salida de consola a winforms ListBox

He construido una biblioteca que vuelca la mayor parte de su texto de depuración utilizando Console.WriteLine ();

Ahora soy el proceso de usar la biblioteca en una aplicación de Windows Forms, y todavía necesito acceso a la salida de la consola. (Para mostrar en una lista / cuadro de texto enriquecido)

Noté que puedo anular el estándar de la consola a un TextWriter, pero cómo podría obtener estos datos en la pantalla.

Traté de hacer algo en la línea de

public partial class Form1 : Form { Timer T; MemoryStream mem; StreamWriter writer; public Form1() { InitializeComponent(); mem = new MemoryStream(1000); writer = new StreamWriter(mem); Console.SetOut(writer); T = new Timer(); T.Interval = 250; // yes this probally is to short. T.Tick += new EventHandler(T_Tick); T.Start(); Console.WriteLine("output"); Console.WriteLine("AnotherLine"); } void T_Tick(object sender, EventArgs e) { string s = Encoding.Default.GetString(mem.ToArray()); string[] Lines = s.Split(Environment.NewLine.ToCharArray()); Output.Items.Clear(); // Output is a listbox foreach (string str in Lines) Output.Items.Add(str); } } 

pero fue en vano. ¿Algunas ideas?

Código innecesario eliminado.

Otra forma, probablemente más limpia, de hacer esto es extender TextWriter con los suyos que se registran en el lugar que desee.

Nota: No he probado esto.

 public class ListBoxWriter : TextWriter { private ListBox list; private StringBuilder content = new StringBuilder(); public ListBoxWriter(ListBox list) { this.list = list; } public override void Write(char value) { base.Write(value); content.Append(value); if (value == '\n') { list.Items.Add(content.ToString()); content = new StringBuilder(); } } public override Encoding Encoding { get { return System.Text.Encoding.UTF8; } } } 

En lugar de intentar “capturar” el texto enviado a la consola, crearía una nueva clase que se encargue de escribir la salida por usted. Entonces esa nueva clase podría escribir en la consola, así como en cualquier otro lugar al que quieras ir.

Si está utilizando la clase de depuración de .NET, simplemente use dos escuchas: ConsoleTraceListener y TextWriterTraceListener.

Para hacer que su código existente funcione, agregue:

 writer.Flush(); 

después de su Console.WriteLine () llama.