重定向命令提示符输出到GUI并保持颜色?

Big*_*ary 9 c# console redirect colors

基本上我正在制作命令提示符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);
Run Code Online (Sandbox Code Playgroud)

然后我创建一个从输出流中读取并将其发送到我的文本框的线程:

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());
}
Run Code Online (Sandbox Code Playgroud)

即使我使用我的花哨的命令提示符启动一个输出彩色文本的应用程序,我也没有得到任何额外的颜色信息(甚至没有与文本混合的ANSI颜色代码).如上所示,我将转到BaseStream并读取字节,然后将它们解码为UTF8.不幸的是,似乎即使是原始字节也不包括原始颜色信息.

如何从我运行的应用程序中获取原始流,而不进行任何过滤?我想要原始字节,以便我可以进行自己的颜色分析并呈现正确颜色的控制台输出.

为了澄清,我不是在问如何解释颜色代码.我只想在流中提供它们.

Max*_*mus 9

输出流的重定向永远不会包含"颜色信息".除了大小写,控制台程序显式输出带有ANSI转义序列的文本.但!Windows控制台不支持ANSI代码,因此存在非常少量的此类程序.

WinAPI中的颜色可以直接写入控制台(不是流),具有一系列控制台功能WriteConsoleOutput.当然,彩色输出可以从具有相应功能的控制台中读取,例如ReadConsoleOutput.当然,控制台窗口必须存在,并且不得隐含重定向.

与unicode相同的问题.Stream不支持UTF-8,除非您在该代码页中询问程序写入输出.但是,当你从控制台(不是流)读取文本时,你ReadConsoleOutputW将从框中获得"unicode".

PS.我自己的控制台模拟器ConEmu(在SO上读取答案)读取控制台输出ReadConsoleOutputW.