.NETでコンソールにカラーで書き込むことは可能ですか?


184

小さなコマンドラインツールを作成する場合、さまざまな色で出力すると便利です。これは可能ですか?

回答:


247

はい。この記事を参照してください。そこからの例です:

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

ここに画像の説明を入力してください


3
背景画像を追加することは可能ですか?
RollRoll

@RollRollはデフォルトのcmd.exeにはありません。ただし、背景画像の微調整をサポートするコンソールエミュレーターを使用することはできますが、それでもプログラムで実行することはできません。
Remigiusz Schoida

+1あなたが10年間以上このことをやっていて、ちょうど 10年前に彼らが知っていたことを学んだとき...これは決して古くなることはありません。
道化師

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

ここから撮影。


54

上記のコメントはどちらもしっかりとした回答ですが、スレッドセーフではないことに注意してください。複数のスレッドでコンソールに書き込んでいる場合、色を変更すると競合状態が追加され、奇妙な出力が作成される可能性があります。ただし、修正は簡単です。

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
同期せずに複数のスレッドから書き込むと、色が変化しなくても出力が文字化けします。競合状態を引き起こすのは色の変化だけではありません
Joe

6
@Joe単一のWrite呼び出しは文字化けしません。stackoverflow.com/questions/4812508/…を参照してください。「安全」ではないのは、書き込み呼び出しの順序だけです。
BatteryBackupUnit 2017年

27

クラシックソリューションの制限なしに、コンソール出力に任意の色(端末でサポートされている場合)を追加できる小さなプラグインNuGetで利用可能)を作成しました。

Stringオブジェクトを拡張することで機能し、構文は非常に簡単です。

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

前景色と背景色の両方がサポートされています。

ここに画像の説明を入力してください


1
これは本当に素晴らしいコードです。基本的に全色拡張を無効にするオプションに感謝します。Linuxでのカラーオプションの使用に適しています(ls –color = auto)。
MianenCZ

13

はい、それは簡単で可能です。最初のデフォルト色を定義します。

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

Console.Clear()新しいコンソールの色を設定することが重要です。この手順を実行しない場合、で値を要求すると、結合された色が表示されますConsole.ReadLine()

次に、各プリントの色を変更できます。

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

プログラムが終了したら、終了時にコンソールの色をリセットしてください。

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

現在、netcoreでは、ターミナルが各オペレーティングシステムで異なる色を使用しているため、ユーザーエクスペリエンスを「維持」したい場合、別の問題があります。

私は、テキスト形式でこの問題を解決するライブラリを作成しています。色、配置、その他多数。自由に使用して貢献してください。

https://github.com/deinsoftware/colorify/およびNuGetパッケージとしても利用可能

Windows / Linux(ダーク)の色:
ここに画像の説明を入力してください

MacOS(ライト)の色:
ここに画像の説明を入力してください


6

上記の回答にすべてを使用することを追加するだけですConsole.WriteLine:同じテキスト行の色を変更するには、たとえば次のように記述します。

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

4

はい、次のように可能です。これらの色をコンソールアプリケーションで使用すると、赤色などのエラーを表示できます。

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

これは、インラインの色変更を含むコンソールメッセージを書くために私が書いた簡単な方法です。1色しかサポートしませんが、私のニーズに合います。

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

    }

インラインの色が変更されたコンソールメッセージの画像

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.