Maison >développement back-end >C++ >Comment puis-je afficher des couleurs personnalisées (comme l'orange) dans mon application console C# ?

Comment puis-je afficher des couleurs personnalisées (comme l'orange) dans mon application console C# ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-02 17:25:40670parcourir

How Can I Display Custom Colors (Like Orange) in My C# Console Application?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn