É possível gravar no console em cores no .NET?


184

Escrevendo uma pequena ferramenta de linha de comando, seria bom produzir em cores diferentes. Isso é possível?

Respostas:


247

Sim. Veja este artigo . Aqui está um exemplo de lá:

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

insira a descrição da imagem aqui


3
é possível adicionar imagem de fundo?
RollRoll

@RollRoll não está no cmd.exe padrão. No entanto, você pode tentar usar um emulador de console, que suporta ajustes na imagem de plano de fundo, mas ainda assim, isso não pode ser feito programaticamente.
Remigiusz Schoida 02/03/19

+1 Quando você faz essas coisas há mais de 10 anos e apenas agora aprendeu o que elas sabiam há 10 anos ... isso nunca envelhece, ha.
Jester

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

Retirado daqui .


54

Os comentários acima são respostas sólidas, no entanto, observe que eles não são seguros para threads. Se você estiver gravando no console com vários threads, a alteração de cores adicionará uma condição de corrida que pode criar uma saída com aparência estranha. É simples de corrigir:

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
Escrevendo de vários segmentos sem sincronização resultará na saída ilegível mesmo se não houver mudanças de cor: ele não está apenas mudando as cores que faz com que uma condição de corrida
Joe

6
@ Joe Uma única Writechamada não será distorcida. Consulte stackoverflow.com/questions/4812508/… . É apenas a ordem das chamadas de gravação que não é "segura".
BatteryBackupUnit 17/10

27

Eu criei um pequeno plugin (disponível no NuGet ) que permite adicionar qualquer cor (se suportada pelo seu terminal) à saída do console, sem as limitações das soluções clássicas.

Ele funciona estendendo o Stringobjeto e a sintaxe é muito simples:

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

As cores de primeiro e segundo plano são suportadas.

insira a descrição da imagem aqui


1
Este é realmente um pedaço incrível de código. Aprecio a opção de basicamente desativar a extensão de cores inteiras. É adequado ao uso da opção de cores no linux (ls –color = auto).
MianenCZ

13

Sim, é fácil e possível. Defina as primeiras cores padrão.

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

Console.Clear()é importante para definir novas cores do console. Se você não fizer essa etapa, poderá ver cores combinadas ao solicitar valores com Console.ReadLine().

Em seguida, você pode alterar as cores em cada impressão:

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

Ao finalizar o programa, lembre-se de redefinir as cores do console ao finalizar:

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

Agora, com o netcore, temos outro problema se você deseja "preservar" a experiência do usuário, porque o terminal tem cores diferentes em cada sistema operacional.

Estou criando uma biblioteca que resolve esse problema com o formato de texto: cores, alinhamento e muito mais. Sinta-se livre para usar e contribuir.

https://github.com/deinsoftware/colorify/ e também disponível como pacote NuGet

Cores para Windows / Linux (Escuro):
insira a descrição da imagem aqui

Cores para MacOS (Light):
insira a descrição da imagem aqui


6

Apenas para adicionar às respostas acima que todos usam Console.WriteLine: para alterar a cor na mesma linha de texto, escreva por exemplo:

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

4

Sim, é possível da seguinte maneira. Essas cores podem ser usadas em um aplicativo de console para visualizar alguns erros na cor vermelha etc.

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

Aqui está um método simples que escrevi para escrever mensagens de console com alterações de cores embutidas. Ele suporta apenas uma cor, mas atende às minhas necessidades.

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

    }

imagem de uma mensagem do console com alterações de cores embutidas

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.