【问题标题】:Is it possible to write to the console in colour in .NET?是否可以在.NET 中以彩色方式写入控制台?
【发布时间】:2010-04-30 08:40:14
【问题描述】:

写一个小命令行工具,输出不同颜色就好了。这可能吗?

【问题讨论】:

    标签: c# .net vb.net colors


    【解决方案1】:

    是的。请参阅此article。这是那里的一个例子:

    Console.BackgroundColor = ConsoleColor.Blue;
    Console.ForegroundColor = ConsoleColor.White;
    Console.WriteLine("White on blue.");
    

    【讨论】:

    • 是否可以添加背景图片?
    • @RollRoll 不在默认的 cmd.exe 中。您可以尝试使用控制台模拟器,它支持背景图像调整,但仍然无法通过编程方式完成。
    【解决方案2】:
    class Program
    {
        static void Main()
        {
            Console.BackgroundColor = ConsoleColor.Blue;
            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine("White on blue.");
            Console.WriteLine("Another line.");
            Console.ResetColor();
        }
    }
    

    取自here

    【讨论】:

      【解决方案3】:

      以上 cmets 都是可靠的响应,但请注意它们不是线程安全的。如果您使用多个线程写入控制台,更改颜色将添加一个竞争条件,可能会创建一些看起来很奇怪的输出。不过修复起来很简单:

      public class ConsoleWriter
      {
          private static object _MessageLock= new object();
      
          public void WriteMessage(string message)
          {
              lock (_MessageLock)
              {
                  Console.BackgroundColor = ConsoleColor.Red;
                  Console.WriteLine(message);
                  Console.ResetColor();
              }
          }
      }
      

      【讨论】:

      • 在不同步的情况下从多个线程写入将导致即使没有颜色更改也会导致输出乱码:导致竞争条件的不仅仅是更改颜色
      • @Joe 单个Write 调用将不会出现乱码。见stackoverflow.com/questions/4812508/…。只是写调用的顺序不“安全”。
      • 但是如果其他进程正在写入同一个控制台呢?他们不会使用您的锁定对象。有没有真正的原子方式来改变颜色,写入控制台,然后改变颜色?
      • 如果您不选择使用控制台编写器,他们将不会使用控制台编写器。这里的含义是您使用此对象对控制台进行所有写入。我想你可以在 Console.Write 命令上做一些棘手的包装,但这看起来有点矫枉过正。
      【解决方案4】:

      我创建了一个small plugin(在NuGet 上可用),它允许您向控制台输出添加任何(如果您的终端支持)颜色,而不受经典的限制解决方案。

      它通过扩展String 对象来工作,语法非常简单:

      "colorize me".Pastel("#1E90FF");
      

      支持前景色和背景色。

      【讨论】:

      • 我相信这个库使用了ANSI escape color codes,这似乎是Microsoft.Extensions.Logging.Console 也在使用的。
      • @Pang Microsoft.Extensions.Logging.Console 是一个日志库,而 Pastel 可用于直接打印到控制台;它似乎还支持我从源代码中获得的有限颜色子集。
      • @Pang 该库由于某种原因没有实现所有前景色。我倾向于使用 Microsoft 解决方案,但 Pastel 解决方案更完整。
      【解决方案5】:

      是的,这很容易而且可能。定义第一个默认颜色。

      Console.BackgroundColor = ConsoleColor.Black;
      Console.ForegroundColor = ConsoleColor.White;
      Console.Clear();
      

      Console.Clear() 设置新的控制台颜色很重要。如果您不执行此步骤,您可以在使用 Console.ReadLine() 询问值时看到组合颜色。

      然后您可以更改每个打印件的颜色:

      Console.BackgroundColor = ConsoleColor.Black;
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine("Red text over black.");
      

      完成程序后,请记住在完成时重置控制台颜色:

      Console.ResetColor();
      Console.Clear();
      

      现在使用 netcore,如果您想“保留”用户体验,我们还有另一个问题,因为终端在每个操作系统上都有不同的颜色。

      我正在制作一个用文本格式解决这个问题的库:颜色、对齐方式等等。随意使用和贡献。

      https://github.com/deinsoftware/colorify/ 也可以作为 NuGet package 使用

      Windows/Linux 的颜色(深色):

      MacOS 的颜色(浅色):

      【讨论】:

        【解决方案6】:

        这是我编写的一个简单的方法,用于编写带有内联颜色更改的控制台消息。它只支持一种颜色,但它符合我的需求。

        // usage: WriteColor("This is my [message] with inline [color] changes.", ConsoleColor.Yellow);
        static void WriteColor(string message, ConsoleColor color)
        {
            var pieces = Regex.Split(message, @"(\[[^\]]*\])");
        
            for(int i=0;i<pieces.Length;i++)
            {
                string piece = pieces[i];
                
                if (piece.StartsWith("[") && piece.EndsWith("]"))
                {
                    Console.ForegroundColor = color;
                    piece = piece.Substring(1,piece.Length-2);          
                }
                
                Console.Write(piece);
                Console.ResetColor();
            }
            
            Console.WriteLine();
        }
        

        【讨论】:

          【解决方案7】:

          只是在上面的答案中添加所有使用Console.WriteLine:在同一行文本上更改颜色,例如:

          Console.Write("This test ");
          Console.BackgroundColor = bTestSuccess ? ConsoleColor.DarkGreen : ConsoleColor.Red;
          Console.ForegroundColor = ConsoleColor.White;
          Console.WriteLine((bTestSuccess ? "PASSED" : "FAILED"));
          Console.ResetColor();
          

          【讨论】:

            【解决方案8】:

            是的,可以如下。这些颜色可以在控制台应用程序中使用,以红色等形式查看一些错误。

            Console.BackgroundColor = ConsoleColor.Blue;
            Console.ForegroundColor = ConsoleColor.White;//after this line every text will be white on blue background
            Console.WriteLine("White on blue.");
            Console.WriteLine("Another line.");
            Console.ResetColor();//reset to the defoult colour
            

            【讨论】:

              【解决方案9】:

              同时为多个单词着色的示例方法。

              private static void WriteColor(string str, params (string substring, ConsoleColor color)[] colors)
              {
                  var words = Regex.Split(str, @"( )");
              
                  foreach (var word in words)
                  {
                      (string substring, ConsoleColor color) cl = colors.FirstOrDefault(x => x.substring.Equals("{" + word + "}"));
                      if (cl.substring != null)
                      {
                          Console.ForegroundColor = cl.color;
                          Console.Write(cl.substring.Substring(1, cl.substring.Length - 2));
                          Console.ResetColor();
                      }
                      else
                      {
                          Console.Write(word);
                      }
                  }
              }
              

              用法:

              WriteColor("This is my message with new color with red", ("{message}", ConsoleColor.Red), ("{with}", ConsoleColor.Blue));
              

              输出:

              【讨论】:

                【解决方案10】:

                当我想使用Console.WriteLine(); 时,我确实只想调整文本颜色 所以我不得不写

                Console.ForegroundColor = ConsoleColor.DarkGreen;
                Console.WriteLine("my message");
                Console.ResetColor();
                

                每次都想写点什么

                所以我发明了我的 WriteLine() 方法,并一直在 Program 类中使用它而不是 Console.WriteLine()

                public static void WriteLine(string buffer, ConsoleColor foreground = ConsoleColor.DarkGreen, ConsoleColor backgroundColor = ConsoleColor.Black)
                {
                   Console.ForegroundColor = foreground;
                   Console.BackgroundColor = backgroundColor;
                   Console.WriteLine(buffer);
                   Console.ResetColor();
                }
                

                为了更简单,我还写了一个Readline() 方法,如下所示:

                public static string ReadLine()
                {
                   var line = Console.ReadLine();
                   return line ?? string.Empty;
                }
                

                所以现在我们必须在控制台中写入或读取内容:

                static void Main(string[] args) {
                   WriteLine("hello this is a colored text");
                   var answer = Readline();
                }
                

                【讨论】:

                  【解决方案11】:

                  我为彩色控制台输出开发了一个名为 cConsole 的小型有趣类库。
                  用法示例:

                  const string tom = "Tom";
                  const string jerry = "Jerry";
                  CConsole.WriteLine($"Hello {tom:red} and {jerry:green}");
                  

                  它使用 C# FormattableString、IFormatProvider 和 ICustomFormatter 接口的一些功能来设置文本切片的前景色和背景色。
                  可以看cConsole源码here

                  【讨论】:

                  • 谢谢 - 非常好。但由于许可证问题,我无法使用。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-01-22
                  • 1970-01-01
                  • 2010-12-11
                  • 1970-01-01
                  • 2015-01-31
                  相关资源
                  最近更新 更多