基本上我正在制作一个命令提示符 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 颜色代码)。正如您在上面看到的,我将前往 BaseStream 并读取字节,然后将它们解码为 UTF8。不幸的是,似乎即使是原始字节也不包括原始颜色信息。
如何从我运行的应用程序中获取原始流,而无需任何过滤?我想要原始字节,以便我可以进行自己的颜色解析并呈现颜色正确的控制台输出。
为了澄清,我不是在问如何解释颜色代码。我只想让它们在流中可用。