¿Es posible escribir en la consola en color en .NET?

184

Al escribir una pequeña herramienta de línea de comando, sería bueno imprimir en diferentes colores. es posible?

NibblyPig
fuente

Respuestas:

247

Si. Ver este artículo . Aquí hay un ejemplo a partir de ahí:

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

ingrese la descripción de la imagen aquí

Mark Byers
fuente
3
¿Es posible agregar una imagen de fondo?
RollRoll
@RollRoll no está en el cmd.exe predeterminado. Sin embargo, puede intentar usar un emulador de consola, que admite ajustes de imagen de fondo, pero aún así, no se puede hacer programáticamente.
Remigiusz Schoida
+1 Cuando has estado haciendo esto durante más de 10 años y recién ahora aprendiste lo que sabían hace 10 años ... esto nunca pasa de moda, ja.
Bufón
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();
    }
}

Tomado de aquí .

Darin Dimitrov
fuente
54

Los comentarios anteriores son respuestas sólidas, sin embargo, tenga en cuenta que no son seguros para subprocesos. Si está escribiendo en la consola con varios subprocesos, el cambio de colores agregará una condición de carrera que puede crear una salida de aspecto extraño. Sin embargo, es fácil de solucionar:

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();
        }
    }
}
Roger Hill
fuente
10
Escribir desde varios subprocesos sin sincronización dará como resultado una salida confusa, incluso si no hay cambios de color: no es solo el cambio de colores lo que causa una condición de carrera
Joe
66
@ Joe Una sola Writellamada no será confusa. Ver stackoverflow.com/questions/4812508/… . Es solo el orden de las llamadas de escritura que no es "seguro".
BatteryBackupUnit
27

Creé un pequeño complemento (disponible en NuGet ) que le permite agregar cualquier color (si es compatible con su terminal) a la salida de su consola, sin las limitaciones de las soluciones clásicas.

Funciona extendiendo el Stringobjeto y la sintaxis es muy simple:

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

Se admiten los colores de primer plano y de fondo.

ingrese la descripción de la imagen aquí

fuego de seda
fuente
1
Esta es una pieza de código realmente sorprendente. Agradezco la opción de desactivar básicamente la extensión de color completo. Se adapta al uso de la opción de color en Linux (ls –color = auto).
MianenCZ
13

Sí, es fácil y posible. Defina los primeros colores predeterminados.

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

Console.Clear()Es importante para establecer nuevos colores de consola. Si no realiza este paso, puede ver los colores combinados cuando solicite valores con Console.ReadLine().

Luego puede cambiar los colores en cada impresión:

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

Cuando finalice su programa, recuerde restablecer los colores de la consola al finalizar:

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

Ahora con netcore tenemos otro problema si desea "preservar" la experiencia del Usuario porque los terminales tienen diferentes colores en cada Sistema Operativo.

Estoy haciendo una biblioteca que resuelve este problema con el formato de texto: colores, alineación y mucho más. Siéntase libre de usar y contribuir.

https://github.com/deinsoftware/colorify/ y también disponible como paquete NuGet

Colores para Windows / Linux (oscuro):
ingrese la descripción de la imagen aquí

Colores para MacOS (claro):
ingrese la descripción de la imagen aquí

equiman
fuente
6

Solo para agregar a las respuestas anteriores que todos usan Console.WriteLine: para cambiar el color en la misma línea de texto, escriba, por ejemplo:

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

Sí, es posible de la siguiente manera. Estos colores se pueden usar en una aplicación de consola para ver algunos errores en color rojo, 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
Chamila Maddumage
fuente
3

Aquí hay un método simple que escribí para escribir mensajes de consola con cambios de color en línea. Solo admite un color, pero se ajusta a mis necesidades.

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

    }

imagen de un mensaje de consola con cambios de color en línea

Walter Stabosz
fuente