可以在.NET中以彩色方式写入控制台吗?


184

编写一个小的命令行工具,最好以不同的颜色输出。这可能吗?

Answers:


246

是。看到这篇文章。这里是一个例子:

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

在此处输入图片说明


3
是否可以添加背景图片?
RollRoll

@RollRoll不在默认的cmd.exe中。您可以尝试使用控制台仿真器,它支持背景图像调整,但是仍然无法通过编程方式完成。
Remigiusz Schoida,

+1当您从事此类工作已超过10年,而现在才刚刚了解他们10年前的知识...。
小丑

115
class Program
{
    static void Main()
    {
        Console.BackgroundColor = ConsoleColor.Blue;
        Console.ForegroundColor = ConsoleColor.White;
        Console.WriteLine("White on blue.");
        Console.WriteLine("Another line.");
        Console.ResetColor();
    }
}

取自这里


54

以上评论都是可靠的回答,但是请注意,它们不是线程安全的。如果您正在使用多个线程向控制台写入数据,则更改颜色会添加一个竞争条件,该竞争条件会创建一些看起来很奇怪的输出。修复起来很简单:

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();
        }
    }
}

10
即使没有颜色变化,也不同步地从多个线程进行写入也会导致输出乱码:不仅仅是颜色的变化会导致竞争状况
Joe

6
@Joe一个Write电话不会乱码。请参阅stackoverflow.com/questions/4812508/…。这只是写调用的顺序,并非“安全”。
BatteryBackupUnit

27

我创建了一个小插件(可在NuGet上获得),该插件可让您在控制台输出中添加任何颜色(如果终端支持),而不受经典解决方案的限制。

它通过扩展String对象而起作用,语法非常简单:

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

支持前景色和背景色。

在此处输入图片说明


1
这真是惊人的代码。我感谢基本上停用整个颜色扩展的选项。它适合在Linux(ls –color = auto)中使用color选项。
MianenCZ

13

是的,这既简单又可行。定义第一个默认颜色。

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包提供

Windows / Linux的颜色(深色):
在此处输入图片说明

MacOS的颜色(浅色):
在此处输入图片说明


6

只需在上面的答案中都添加Console.WriteLine:即可更改同一行文本的颜色,例如:

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

4

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

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

3

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

    // 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();

    }

具有内联颜色更改的控制台消息的图像

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.