เป็นไปได้หรือไม่ที่จะเขียนลงในคอนโซลสีใน. 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 ปีที่ผ่านมา .... นี้ไม่เคยได้รับเก่าฮ่า
ตลก


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

27

ฉันได้สร้างปลั๊กอินขนาดเล็ก (มีให้บริการบนNuGet ) ที่ช่วยให้คุณเพิ่มสีใด ๆ (ถ้ารองรับโดยเทอร์มินัลของคุณ) ลงในเอาต์พุตคอนโซลของคุณโดยไม่มีข้อ จำกัด ของโซลูชันแบบคลาสสิก

มันทำงานโดยการขยายStringวัตถุและไวยากรณ์ง่ายมาก:

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

รองรับทั้งสีพื้นหน้าและสีพื้นหลัง

ป้อนคำอธิบายรูปภาพที่นี่


1
นี่เป็นโค้ดที่น่าทึ่งจริงๆ ฉันขอขอบคุณตัวเลือกที่จะยกเลิกการขยายสีทั้งหมด มันเหมาะกับการใช้ตัวเลือกสีใน linux (ls –color = auto)
MianenCZ

13

ใช่มันง่ายและ posible กำหนดสีเริ่มต้นแรก

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 (Light):
ป้อนคำอธิบายรูปภาพที่นี่


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

นี่เป็นวิธีง่าย ๆ ที่ฉันเขียนเพื่อเขียนข้อความคอนโซลด้วยการเปลี่ยนสีแบบอินไลน์ รองรับเพียงสีเดียว แต่เหมาะกับความต้องการของฉัน

    // 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.