Farbiger Text in Konsolenanwendungen
Die integrierte ConsoleColor-Enumeration bietet eine begrenzte Auswahl an Textfarben für C#-Konsolenanwendungen. Es kann jedoch vorkommen, dass Sie eine bestimmte Farbe wünschen, z. B. Orange, die nicht enthalten ist.
Einschränkungen der ConsoleColor-Enumeration
Die ConsoleColor-Enumeration listet den unterstützten Text auf Farben, die sind:
Black DarkBlue DarkGreen DarkCyan DarkRed DarkMagenta DarkYellow Gray DarkGray Blue Green Cyan Red Magenta Yellow White
Wie Sie sehen können, ist Orange in diesem Satz nicht vorhanden Farben.
Benutzerdefinierte Textfarbe über P/Invoke
Um benutzerdefinierte Textfarben zu erreichen, können wir in die Bereiche des Plattformaufrufs (P/Invoke) eintauchen. Durch die Verwendung der SetConsoleScreenBufferInfoEx()-Funktion aus der Bibliothek kernel32.dll können wir die Farbeinstellungen der Konsole direkt manipulieren.
Definieren Sie zunächst die erforderlichen Datenstrukturen:
[StructLayout(LayoutKind.Sequential)] internal struct COORD { public short X; public short Y; } [StructLayout(LayoutKind.Sequential)] internal struct SMALL_RECT { public short Left; public short Top; public short Right; public short Bottom; } [StructLayout(LayoutKind.Sequential)] internal struct COLORREF { public uint ColorDWORD; public COLORREF(Color color) { ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16); } } [StructLayout(LayoutKind.Sequential)] internal 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; ... }
Dann importieren Sie die Erforderliche Funktionen von kernel32.dll:
[DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool GetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetConsoleScreenBufferInfoEx(IntPtr hConsoleOutput, ref CONSOLE_SCREEN_BUFFER_INFO_EX csbe);
Benutzerdefiniert festlegen Farben
Mit diesen Tools können wir jetzt Methoden definieren, um bestimmte Konsolenfarben, einschließlich Orange, festzulegen:
public static int SetColor(ConsoleColor consoleColor, Color targetColor) { // Fetch console details CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX(); csbe.cbSize = (int)Marshal.SizeOf(csbe); IntPtr hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); bool brc = GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe); if (!brc) return Marshal.GetLastWin32Error(); // Set the specified color component switch (consoleColor) { case ConsoleColor.Black: csbe.black = new COLORREF(targetColor); break; ... // Other colors defined similarly } // Apply the Color brc = SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe); if (!brc) return Marshal.GetLastWin32Error(); return 0; } public static int SetScreenColors(Color foregroundColor, Color backgroundColor) { int irc = SetColor(ConsoleColor.Gray, foregroundColor); if (irc != 0) return irc; irc = SetColor(ConsoleColor.Black, backgroundColor); return irc; }
Sehen wir uns nun ein Beispiel von SetScreenColors in Aktion an:
static void Main(string[] args) { Color screenTextColor = Color.Orange; Color screenBackgroundColor = Color.Black; SetScreenColors(screenTextColor, screenBackgroundColor); Console.WriteLine("Hello World!"); Console.ReadKey(); }
Mit der oben genannten Methode können Sie die Vordergrund- und Hintergrundfarben Ihrer Konsole auf beliebige RGB-Werte, einschließlich Orange, einstellen. Viel Spaß beim Anpassen Ihrer Konsolenausgabe!
Das obige ist der detaillierte Inhalt vonWie kann ich benutzerdefinierte Farben (z. B. Orange) in meiner C#-Konsolenanwendung anzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!