首页 >后端开发 >C++ >如何在我的 C# 控制台应用程序中显示自定义颜色(如橙色)?

如何在我的 C# 控制台应用程序中显示自定义颜色(如橙色)?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-02 17:25:40608浏览

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

控制台应用程序中的彩色文本

内置 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn