控制台應用程式中的彩色文字
內建 ConsoleColor 枚舉為 C# 控制台應用程式提供了有限的文字顏色選擇。但是,有時您可能需要特定的顏色,例如橙色,但該顏色未包含在內。
ConsoleColor 列舉的限制
ConsoleColor 列舉列出了支援的文字顏色,分別是:
Black DarkBlue DarkGreen DarkCyan DarkRed DarkMagenta DarkYellow Gray DarkGray Blue Green Cyan Red Magenta Yellow White
如您所見,橘色不存在於這組顏色中
透過P/Invoke 自訂文字顏色
要實作自訂文字顏色,我們可以深入研究平台呼叫 (P/Invoke) 領域。透過利用kernel32.dll庫中的SetConsoleScreenBufferInfoEx()函數,我們可以直接操作控制台的顏色設定。
首先,定義必要的資料結構:
[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; ... }
然後,匯入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);
設定自訂顏色
使用這些工具,我們現在可以定義方法來設定特定的控制台顏色,包括橘色:
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; }
現在,讓我們來看看SetScreenColors 的範例:
static void Main(string[] args) { Color screenTextColor = Color.Orange; Color screenBackgroundColor = Color.Black; SetScreenColors(screenTextColor, screenBackgroundColor); Console.WriteLine("Hello World!"); Console.ReadKey(); }
透過使用上述方法,您可以將控制台的前景色和背景色設定為任何所需的 RGB 值,包括橘色。享受自訂控制台輸出的樂趣!
以上是如何在我的 C# 控制台應用程式中顯示自訂顏色(如橙色)?的詳細內容。更多資訊請關注PHP中文網其他相關文章!