C# 将命令提示符输出重定向到GUI并保留颜色?

C# 将命令提示符输出重定向到GUI并保留颜色?,c#,redirect,colors,console,C#,Redirect,Colors,Console,基本上,我正在制作一个命令提示符GUI。用户在富文本框中看到命令提示输出,并在下面的普通文本框中输入命令。我已经成功地完成了这项工作,只是对我来说,似乎不可能获得颜色信息。例如,如果我运行一个输出红色错误文本的程序,我不会得到颜色代码字节,它们根本不在流中 这就是我现在正在做的。要启动此过程,请执行以下操作: ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Windows\System32\cmd.exe"); startInfo.U

基本上,我正在制作一个命令提示符GUI。用户在富文本框中看到命令提示输出,并在下面的普通文本框中输入命令。我已经成功地完成了这项工作,只是对我来说,似乎不可能获得颜色信息。例如,如果我运行一个输出红色错误文本的程序,我不会得到颜色代码字节,它们根本不在流中

这就是我现在正在做的。要启动此过程,请执行以下操作:

ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\Windows\System32\cmd.exe");
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;

this.promptProcess = Process.Start(startInfo);
然后我创建一个线程,从输出流中读取数据并将其发送到我的文本框:

while (true)
{
    while (this.stream.EndOfStream) ;

    //read until there's nothing left in the stream, writing to the (locked) output box                    
    byte [] buffer = new byte[1000];
    int numberRead;
    StringBuilder builder = new StringBuilder();
    do
    {
        numberRead = this.stream.BaseStream.Read(buffer, 0, buffer.Length);
        char[] characters = UTF8Decoder.GetChars(buffer, 0, numberRead);
        builder.Append(characters);
    }
    while (numberRead == buffer.Length);

    this.writeToOutput(builder.ToString());
}
即使我使用我的命令提示符启动一个可以输出彩色文本的应用程序,我也不会得到任何额外的颜色信息(即使是与文本混合的ANSI颜色代码)。正如您在上面看到的,我将进入基流并读取字节,然后将它们解码为UTF8。不幸的是,即使是原始字节似乎也不包含原始颜色信息

如何从运行的应用程序中获取原始流,而不进行任何筛选?我需要原始字节,以便我可以进行自己的颜色分析,并正确显示颜色的控制台输出。


为了澄清,我不是问如何解释颜色代码。我只想让它们在流中可用。

输出流的重定向永远不会包含“颜色信息”。除此之外,当控制台程序显式输出带有ANSI转义序列的文本时。但是Windows控制台不支持ANSI代码,因此存在少量此类程序

WinAPI中的颜色只能直接写入控制台(而不是流),使用控制台函数系列,如
WriteConsoleOutput
。当然,可以使用相应的函数从控制台读取彩色输出,如
ReadConsoleOutput
。当然,控制台窗口必须存在,而不是暗示重定向

unicode也有同样的问题。流不支持UTF-8,除非您要求程序在该代码页中写入输出。但是,当您使用
ReadConsoleOutputW
从控制台(而不是流)读取文本时,您将“从框中”获得unicode


我自己的控制台模拟器ConEmu()通过
ReadConsoleOutputW

读取控制台输出,这是一个“练习”吗?如果没有,那么您正在寻找更好的控制台-查看?从这一点上,我知道我的方案是不可行的,因为Windows命令提示符没有以“文本流”格式提供颜色输出信息(甚至没有转义码来指示颜色更改)。您提到的函数很有趣,但不适合我的需要,因为我需要一个文本流,以便我的应用程序可以在提示输出时响应它,而不是将提示视为图形窗口。在我的情况下,切换控制台不是一个选项。尽管如此,非常感谢您周到的回复!