Est-il possible d'écrire sur la console en couleur en .NET?

184

En écrivant un petit outil de ligne de commande, ce serait bien de sortir dans différentes couleurs. Est-ce possible?

NibblyPig
la source

Réponses:

248

Oui. Consultez cet article . Voici un exemple à partir de là:

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

entrez la description de l'image ici

Mark Byers
la source
3
est-il possible d'ajouter une image de fond?
RollRoll le
@RollRoll n'est pas dans le cmd.exe par défaut. Vous pouvez cependant essayer d'utiliser un émulateur de console, qui prend en charge le réglage de l'image d'arrière-plan, mais cela ne peut quand même pas être fait par programme.
Remigiusz Schoida
+1 Quand vous faites ce truc depuis plus de 10 ans et que vous venez d' apprendre ce qu'ils savaient il y a 10 ans ... cela ne vieillit jamais, 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();
    }
}

Pris d' ici .

Darin Dimitrov
la source
54

Les commentaires ci-dessus sont tous deux des réponses solides, mais notez qu'ils ne sont pas thread-safe. Si vous écrivez sur la console avec plusieurs threads, le changement de couleurs ajoutera une condition de concurrence qui peut créer une sortie étrange. C'est simple à réparer:

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
la source
10
L'écriture à partir de plusieurs threads sans synchronisation entraînera une sortie brouillée même s'il n'y a pas de changement de couleur: ce n'est pas seulement le changement de couleurs qui provoque une condition de
concurrence
6
@Joe Un seul Writeappel ne sera pas brouillé. Voir stackoverflow.com/questions/4812508/… . C'est juste l'ordre des appels en écriture qui n'est pas "sûr".
BatteryBackupUnit
27

J'ai créé un petit plugin (disponible sur NuGet ) qui vous permet d'ajouter n'importe quelle couleur (si prise en charge par votre terminal) à la sortie de votre console, sans les limitations des solutions classiques.

Cela fonctionne en étendant l' Stringobjet et la syntaxe est très simple:

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

Les couleurs de premier plan et d'arrière-plan sont prises en charge.

entrez la description de l'image ici

feu de soie
la source
1
C'est un morceau de code vraiment incroyable. J'apprécie l'option de désactiver essentiellement l'extension de couleur entière. Cela convient à l'utilisation de l'option de couleur sous Linux (ls –color = auto).
MianenCZ
13

Oui, c'est facile et possible. Définissez les premières couleurs par défaut.

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

Console.Clear()c'est important pour définir de nouvelles couleurs de console. Si vous n'effectuez pas cette étape, vous pouvez voir les couleurs combinées lorsque vous demandez des valeurs avec Console.ReadLine().

Ensuite, vous pouvez changer les couleurs sur chaque impression:

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

Lorsque vous avez terminé votre programme, n'oubliez pas de réinitialiser les couleurs de la console à la fin:

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

Maintenant, avec netcore, nous avons un autre problème si vous voulez "préserver" l'expérience utilisateur car les terminaux ont des couleurs différentes sur chaque système d'exploitation.

Je crée une bibliothèque qui résout ce problème avec le format texte: couleurs, alignement et bien plus encore. N'hésitez pas à utiliser et à contribuer.

https://github.com/deinsoftware/colorify/ et également disponible en tant que package NuGet

Couleurs pour Windows / Linux (foncé):
entrez la description de l'image ici

Couleurs pour MacOS (clair):
entrez la description de l'image ici

Equiman
la source
6

Juste pour ajouter aux réponses ci-dessus que tous utilisent Console.WriteLine: pour changer de couleur sur la même ligne de texte, écrivez par exemple:

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

Oui, c'est possible comme suit. Ces couleurs peuvent être utilisées dans une application console pour visualiser certaines erreurs de couleur rouge 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
la source
3

Voici une méthode simple que j'ai écrite pour écrire des messages de console avec des changements de couleur en ligne. Il ne prend en charge qu'une seule couleur, mais il répond à mes besoins.

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

    }

image d'un message de console avec des changements de couleur en ligne

Walter Stabosz
la source