Apakah mungkin untuk menulis ke konsol dengan warna dalam .NET?

184

Menulis alat baris perintah kecil, akan menyenangkan untuk menghasilkan warna yang berbeda. Apakah ini mungkin?

NibblyPig
sumber

Jawaban:

247

Iya. Lihat artikel ini . Berikut ini contoh dari sana:

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

masukkan deskripsi gambar di sini

Mark Byers
sumber
3
apakah mungkin menambahkan gambar latar belakang?
RollRoll
@ Rolloll tidak dalam cmd.exe default. Anda dapat mencoba menggunakan emulator Konsol, yang mendukung tweaking gambar latar belakang, tetapi tetap saja tidak bisa dilakukan secara terprogram.
Remigiusz Schoida
1 Ketika Anda sudah melakukan hal ini selama lebih dari 10 tahun dan hanya sekarang belajar apa yang mereka tahu 10 tahun yang lalu .... ini tidak pernah menjadi tua, 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();
    }
}

Diambil dari sini .

Darin Dimitrov
sumber
54

Komentar di atas sama-sama respons yang solid, namun perhatikan bahwa komentar tersebut tidak aman. Jika Anda menulis ke konsol dengan banyak utas, mengubah warna akan menambah kondisi balapan yang dapat menghasilkan keluaran yang tampak aneh. Sangat mudah untuk memperbaikinya:

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
sumber
10
Menulis dari banyak utas tanpa sinkronisasi akan menghasilkan keluaran yang kacau bahkan jika tidak ada perubahan warna: itu bukan hanya mengubah warna yang menyebabkan kondisi balapan
Joe
6
@ Jo. Satu Writepanggilan tidak akan kacau. Lihat stackoverflow.com/questions/4812508/… . Hanya urutan dari panggilan tulis yang tidak "aman".
BatteryBackupUnit
27

Saya telah membuat sebuah plugin kecil (tersedia di NuGet ) yang memungkinkan Anda untuk menambahkan warna apa pun (jika didukung oleh terminal Anda) ke output konsol Anda, tanpa batasan dari solusi klasik.

Ia bekerja dengan memperluas Stringobjek dan sintaksnya sangat sederhana:

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

Warna foreground dan background didukung.

masukkan deskripsi gambar di sini

ulat sutra
sumber
1
Ini adalah kode yang sangat luar biasa. Saya menghargai opsi untuk menonaktifkan ekstensi seluruh warna pada dasarnya. Ini sesuai dengan penggunaan opsi warna di linux (ls –color = auto).
MianenCZ
13

Ya, mudah dan posible. Tentukan warna default pertama.

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

Console.Clear()itu penting untuk mengatur warna konsol baru. Jika Anda tidak melakukan langkah ini, Anda dapat melihat warna gabungan saat meminta nilai Console.ReadLine().

Kemudian Anda dapat mengubah warna pada setiap cetakan:

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

Saat menyelesaikan program Anda, ingatlah untuk mengatur ulang warna konsol saat selesai:

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

Sekarang dengan netcore kami memiliki masalah lain jika Anda ingin "mempertahankan" pengalaman Pengguna karena terminal memiliki warna yang berbeda pada setiap Sistem Operatif.

Saya sedang membuat perpustakaan yang memecahkan masalah ini dengan Format Teks: warna, perataan dan banyak lagi. Jangan ragu untuk menggunakan dan berkontribusi.

https://github.com/deinsoftware/colorify/ dan juga tersedia sebagai paket NuGet

Warna untuk Windows / Linux (Gelap):
masukkan deskripsi gambar di sini

Warna untuk MacOS (Cahaya):
masukkan deskripsi gambar di sini

Equiman
sumber
6

Hanya untuk menambahkan jawaban di atas yang semuanya gunakan Console.WriteLine: untuk mengubah warna pada baris teks yang sama, tulis misalnya:

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

Ya itu mungkin sebagai berikut. Warna-warna ini dapat digunakan dalam aplikasi konsol untuk melihat beberapa kesalahan dalam warna merah dll ...

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
sumber
3

Berikut adalah metode sederhana yang saya tulis untuk menulis pesan konsol dengan perubahan warna sebaris. Ini hanya mendukung satu warna, tetapi sesuai dengan kebutuhan saya.

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

    }

gambar pesan konsol dengan perubahan warna sebaris

Walter Stabosz
sumber