Home >Backend Development >C++ >How can I add custom colors, like orange, to my C# console application?

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

DDD
DDDOriginal
2025-01-03 10:48:40667browse

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

Custom Colors in C# Console Applications

In C# console applications, the ability to customize font colors beyond the default console colors is a valuable feature. Unfortunately, the list of available colors is limited, lacking the desired orange color.

Available Options for Custom Colors

While the provided list of colors is the official set supported by the console, there is a way to achieve custom colors:

  • Using External Libraries: Specialized libraries can be integrated to extend the console's capabilities and provide a wider color palette. One such library is ConsoleTools.
  • Low-Level PINVOKE: This method involves accessing the Windows APIs directly to manipulate the console buffer attributes. It allows for more control over color management but requires a deep understanding of system-level programming.

Changing Console Colors Programmatically

Once you have chosen a method for custom color support, you can implement color changes in your C# program:

  • External Library Method:

    • Install the ConsoleTools library.
    • Create a new instance of ColorfulConsole.
    • Set background and foreground colors using BackgroundColor and ForegroundColor properties.
  • PINVOKE Method:

    • Obtain the existing console buffer info using GetConsoleScreenBufferInfoEx.
    • Modify the color attributes of the desired color.
    • Set the new buffer info using SetConsoleScreenBufferInfoEx.

Specific Implementation Using PINVOKE

The provided code snippet demonstrates how to use the PINVOKE method to set custom colors, including 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();
    }
}

By using this method, you can set any desired color, including orange, as the console's foreground or background color, providing a richer and customizable user experience in your C# console applications.

The above is the detailed content of How can I add custom colors, like orange, to my C# console application?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn