【问题标题】:Redirect command prompt output to GUI and KEEP COLOR?将命令提示符输出重定向到 GUI 并保持颜色?
【发布时间】:2012-09-16 10:00:35
【问题描述】:

基本上我正在制作一个命令提示符 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。不幸的是,似乎即使是原始字节也不包含原始颜色信息。

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

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

【问题讨论】:

  • 是“运动”吗?如果没有,您正在寻找更好的控制台 - 看看ConEmu?

标签: c# redirect colors console


【解决方案1】:

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

WinAPI 中的颜色只能直接写入控制台(而不是流),具有 console 系列函数,如WriteConsoleOutput。自然地,可以从带有相应功能的控制台读取彩色输出,例如ReadConsoleOutput。当然,控制台窗口必须存在,不能隐含重定向。

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

PS。我自己的控制台模拟器 ConEmu (read answer on SO) 通过 ReadConsoleOutputW 读取控制台输出。

【讨论】:

  • 从这里,我知道我的方案不可行,因为 Windows 命令提示符不会以“文本流”格式提供颜色输出信息(即使使用转义码来指示颜色)变化)。您提到的功能很有趣,但不符合我的需要,因为我需要一个文本流,以便我的应用程序可以在提示输出发生时响应它,而不是将提示视为图形窗口。就我而言,切换控制台不是一种选择。尽管如此,非常感谢您的周到回复!
猜你喜欢
  • 2010-10-22
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多