Texte coloré dans les applications de console
L'énumération ConsoleColor intégrée fournit une sélection limitée de couleurs de texte pour les applications de console C#. Cependant, il peut arriver que vous souhaitiez une couleur spécifique, telle que l'orange, qui n'est pas incluse.
Limitations de l'énumération ConsoleColor
L'énumération ConsoleColor répertorie le texte pris en charge couleurs, qui sont :
Black DarkBlue DarkGreen DarkCyan DarkRed DarkMagenta DarkYellow Gray DarkGray Blue Green Cyan Red Magenta Yellow White
Comme vous pouvez le constater, l'orange n'est pas présent dans cet ensemble de couleurs.
Couleur de texte personnalisée via P/Invoke
Pour obtenir des couleurs de texte personnalisées, nous pouvons nous plonger dans les domaines de l'invocation de plate-forme (P/Invoke). En utilisant la fonction SetConsoleScreenBufferInfoEx() de la bibliothèque kernel32.dll, nous pouvons manipuler directement les paramètres de couleur de la console.
Tout d'abord, définissez les structures de données nécessaires :
[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; ... }
Ensuite, importez le fonctions requises à partir de 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);
Définition personnalisée Couleurs
Avec ces outils, nous pouvons désormais définir des méthodes pour définir des couleurs spécifiques de la console, y compris l'orange :
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; }
Voyons maintenant un exemple de SetScreenColors en action :
static void Main(string[] args) { Color screenTextColor = Color.Orange; Color screenBackgroundColor = Color.Black; SetScreenColors(screenTextColor, screenBackgroundColor); Console.WriteLine("Hello World!"); Console.ReadKey(); }
En utilisant la méthode ci-dessus, vous pouvez définir les couleurs de premier plan et d'arrière-plan de votre console sur n'importe quelle valeur RVB souhaitée, y compris l'orange. Profitez de la personnalisation de la sortie de votre console !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!