Czy można pisać do konsoli w kolorze w .NET?


184

Pisząc małe narzędzie wiersza poleceń, fajnie byłoby wyświetlać w różnych kolorach. czy to możliwe?

Odpowiedzi:


247

Tak. Zobacz ten artykuł . Oto przykład stamtąd:

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

wprowadź opis zdjęcia tutaj


3
czy można dodać obraz tła?
RollRoll

@RollRoll nie znajduje się w domyślnym cmd.exe. Możesz jednak spróbować użyć emulatora konsoli, który obsługuje ulepszanie obrazu tła, ale i tak nie można tego zrobić programowo.
Remigiusz Schoida

+1 Kiedy robiłeś te rzeczy od ponad 10 lat i dopiero teraz dowiedziałeś się, co wiedzieli 10 lat temu ... to nigdy się nie zestarzeje, 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();
    }
}

Zabrano stąd .


54

Powyższe komentarze to solidne odpowiedzi, jednak należy pamiętać, że nie są one bezpieczne dla wątków. Jeśli piszesz do konsoli z wieloma wątkami, zmiana kolorów doda warunek wyścigu, który może stworzyć dziwnie wyglądający wynik. Łatwo to jednak naprawić:

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
Pisanie z wielu wątków bez synchronizacji spowoduje zniekształcone wyjście, nawet jeśli nie zostaną zmienione kolory: nie tylko zmiana kolorów powoduje wyścig
Joe

6
@Joe Pojedyncze Writepołączenie nie będzie zniekształcone. Zobacz stackoverflow.com/questions/4812508/… . To tylko kolejność wywołań zapisu, co nie jest „bezpieczne”.
BatteryBackupUnit

27

Stworzyłem małą wtyczkę (dostępną na NuGet ), która pozwala na dodawanie dowolnych kolor (jeśli jest obsługiwany przez terminal) do wyjścia konsoli, bez ograniczeń klasycznych rozwiązań.

Działa poprzez rozszerzenie Stringobiektu, a składnia jest bardzo prosta:

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

Obsługiwane są zarówno kolory pierwszego planu, jak i tła.

wprowadź opis zdjęcia tutaj


1
To naprawdę niesamowity kawałek kodu. Doceniam opcję dezaktywacji przedłużenia całego koloru. Pasuje do użycia opcji koloru w systemie Linux (ls –color = auto).
MianenCZ

13

Tak, to łatwe i możliwe. Zdefiniuj pierwsze domyślne kolory.

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

Console.Clear()jest to ważne, aby ustawić nowe kolory konsoli. Jeśli nie wykonasz tego kroku, zobaczysz połączone kolory, gdy poprosisz o wartości za pomocą Console.ReadLine().

Następnie możesz zmienić kolory na każdym wydruku:

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

Po zakończeniu programu pamiętaj, aby po zakończeniu zresetować kolory konsoli:

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

Teraz z netcore mamy kolejny problem, jeśli chcesz „zachować” wrażenia użytkownika, ponieważ terminal ma różne kolory w każdym systemie operacyjnym.

Tworzę bibliotekę, która rozwiązuje ten problem z formatem tekstu: kolory, wyrównanie i wiele więcej. Zapraszam do korzystania i przyczyniania się.

https://github.com/deinsoftware/colorify/, a także dostępny jako pakiet NuGet

Kolory dla systemu Windows / Linux (ciemny):
wprowadź opis zdjęcia tutaj

Kolory dla MacOS (jasny):
wprowadź opis zdjęcia tutaj


6

Aby dodać do powyższych odpowiedzi, których wszyscy używają Console.WriteLine: aby zmienić kolor w tym samym wierszu tekstu, napisz na przykład:

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

4

Tak, jest to możliwe w następujący sposób. Te kolory mogą być używane w aplikacji konsolowej do wyświetlania niektórych błędów w kolorze czerwonym itp.

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

Oto prosta metoda, którą napisałem do pisania komunikatów konsoli z wbudowanymi zmianami kolorów. Obsługuje tylko jeden kolor, ale pasuje do moich potrzeb.

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

    }

obraz komunikatu konsoli z wbudowanymi zmianami kolorów

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.