Heim >Backend-Entwicklung >C++ >Wie kann ich meiner C#-Konsolenanwendung benutzerdefinierte Farben wie Orange hinzufügen?

Wie kann ich meiner C#-Konsolenanwendung benutzerdefinierte Farben wie Orange hinzufügen?

DDD
DDDOriginal
2025-01-03 10:48:40670Durchsuche

How can I add custom colors, like orange, to my C# console application?

Benutzerdefinierte Farben in C#-Konsolenanwendungen

In C#-Konsolenanwendungen ist die Möglichkeit, Schriftfarben über die Standardkonsolenfarben hinaus anzupassen, eine wertvolle Funktion . Leider ist die Liste der verfügbaren Farben begrenzt und es fehlt die gewünschte orange Farbe.

Verfügbare Optionen für benutzerdefinierte Farben

Während die bereitgestellte Farbliste der offiziell unterstützte Satz ist Über die Konsole gibt es eine Möglichkeit, benutzerdefinierte Farben zu erreichen:

  • Verwendung externer Bibliotheken: Spezialisierte Bibliotheken können integriert werden, um die Fähigkeiten der Konsole zu erweitern und eine breitere Farbpalette bereitzustellen. Eine solche Bibliothek ist ConsoleTools.
  • Low-Level PINVOKE: Diese Methode beinhaltet den direkten Zugriff auf die Windows-APIs, um die Konsolenpufferattribute zu manipulieren. Es ermöglicht eine bessere Kontrolle über das Farbmanagement, erfordert jedoch ein tiefes Verständnis der Programmierung auf Systemebene.

Konsolenfarben programmgesteuert ändern

Sobald Sie eine Methode ausgewählt haben Für benutzerdefinierte Farbunterstützung können Sie Farbänderungen in Ihrem C#-Programm implementieren:

  • Externe Bibliothek Methode:

    • Installieren Sie die ConsoleTools-Bibliothek.
    • Erstellen Sie eine neue Instanz von ColorfulConsole.
    • Legen Sie Hintergrund- und Vordergrundfarben mithilfe der Eigenschaften BackgroundColor und ForegroundColor fest.
  • PINVOKE Methode:

    • Erhalten Sie die vorhandenen Konsolenpufferinformationen mit GetConsoleScreenBufferInfoEx.
    • Ändern Sie die Farbattribute der gewünschten Farbe.
    • Legen Sie die neuen Pufferinformationen mit fest SetConsoleScreenBufferInfoEx.

Spezifische Implementierung mit PINVOKE

Das bereitgestellte Codefragment zeigt, wie die PINVOKE-Methode zum Festlegen benutzerdefinierter Farben verwendet wird, einschließlich orange:

using System;
using System.Drawing;
using System.Runtime.InteropServices;

public class CustomConsoleColors
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);

    [StructLayout(LayoutKind.Sequential)]
    private struct COORD
    {
        public short X;
        public short Y;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct SMALL_RECT
    {
        public short Left;
        public short Top;
        public short Right;
        public short Bottom;
    }

    [StructLayout(LayoutKind.Sequential)]
    private struct CONSOLE_SCREEN_BUFFER_INFO_EX
    {
        public int cbSize;
        public COORD dwSize;
        public COORD dwCursorPosition;
        public ushort wAttributes;
        public SMALL_RECT srWindow;
        public COORD dwMaximumWindowSize;
        public ushort wPopupAttributes;
        public bool bFullscreenSupported;
        public uint black;
        public uint darkBlue;
        public uint darkGreen;
        public uint darkCyan;
        public uint darkRed;
        public uint darkMagenta;
        public uint darkYellow;
        public uint gray;
        public uint darkGray;
        public uint blue;
        public uint green;
        public uint cyan;
        public uint red;
        public uint magenta;
        public uint yellow;
        public uint white;
    }

    public static void SetColor(ConsoleColor color, Color targetColor)
    {
        CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX();
        csbe.cbSize = Marshal.SizeOf(csbe);
        IntPtr hConsoleOutput = GetStdHandle(-11);
        if (hConsoleOutput == new IntPtr(-1))
            throw new Exception("Error retrieving console buffer handle");
        if (!GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe))
            throw new Exception("Error retrieving console buffer info");

        switch (color)
        {
            case ConsoleColor.Black:
                csbe.black = ColorTranslator.ToWin32(targetColor);
                break;
            case ConsoleColor.DarkBlue:
                csbe.darkBlue = ColorTranslator.ToWin32(targetColor);
                break;
            // ... (similar code for other colors)
            case ConsoleColor.DarkYellow:
                csbe.darkYellow = ColorTranslator.ToWin32(targetColor);
                break;
            case ConsoleColor.Gray:
                csbe.gray = ColorTranslator.ToWin32(targetColor);
                break;
            // ... (similar code for other colors)
            case ConsoleColor.White:
                csbe.white = ColorTranslator.ToWin32(targetColor);
                break;
        }

        if (!SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe))
            throw new Exception("Error setting console buffer info");
    }

    public static void Main()
    {
        SetColor(ConsoleColor.DarkYellow, Color.Orange);
        Console.WriteLine("Custom orange color applied!");
        Console.ReadLine();
    }
}

Mit dieser Methode können Sie jede gewünschte Farbe einstellen, einschließlich Orange als Vordergrund- oder Hintergrundfarbe der Konsole, was eine reichhaltigere und anpassbare Benutzererfahrung in Ihren C#-Konsolenanwendungen bietet.

Das obige ist der detaillierte Inhalt vonWie kann ich meiner C#-Konsolenanwendung benutzerdefinierte Farben wie Orange hinzufügen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn