C# 将ConsoleColor更改为十六进制值

C# 将ConsoleColor更改为十六进制值,c#,.net,colors,background,console,C#,.net,Colors,Background,Console,所以我最近开始学习C#,我正在努力将控制台的背景颜色更改为十六进制值。这是我的密码: using System; namespace MyFisrtC_App { class Program { static void Main(string[] args) { ConsoleColor BGColor = ConsoleColor.White; ConsoleColor FGColor = Con

所以我最近开始学习C#,我正在努力将控制台的背景颜色更改为十六进制值。这是我的密码:

using System;

namespace MyFisrtC_App
{
    class Program
    {
        static void Main(string[] args)
        {
            ConsoleColor BGColor = ConsoleColor.White;
            ConsoleColor FGColor = ConsoleColor.Black;

            Console.Title = "Dumb App";
            Console.BackgroundColor = BGColor;
            Console.ForegroundColor = FGColor;

            Console.Clear();

            Console.WriteLine("This is just a simple dumb app. There is nothing special about it.");

            Console.ReadKey();
        }
    }
}
此外,如果你知道如何在C#中更改字体,那将非常酷

using System;

namespace TestCSharp
{
class Program
{
    static void Main(string[] args)
    {
        Console.ForegroundColor = ConsoleColor.White;
        Console.BackgroundColor = ConsoleColor.Red;
        Console.WriteLine("background red and text white");
        Console.ResetColor();
        Console.WriteLine("Color reset");
        Console.ReadKey();
    }
  }
}
不能使用十六进制值,可以使用以下颜色:

黑色, 深蓝色, 暗绿色, 黑暗势力, 黑暗的, 黑金塔, 黑暗之王, 灰色 暗雷, 蓝色 绿色 青色, 红色 洋红 黄色的,
白色

控制台颜色是一个枚举,本质上是一个具有已定义名称的数字列表。因此,您可以执行以下操作将数字转换为颜色

        int number = 7;
        ConsoleColor colour = (ConsoleColor)number;
如果你想从十六进制开始,使用下面的

string hex = "0A";
int number = Convert.ToInt32(hex, 16);
ConsoleColor colour = (ConsoleColor)number;
例如,您只需要确保数字不超出枚举的长度

if(number < Enum.GetValues<ConsoleColor>().Length -1 && number >= 0)
{
   Console.ForeGroundColor = (ConsoleColor)number;
}
if(number=0)
{
Console.ForeGroundColor=(ConsoleColor)编号;
}

很遗憾,由于控制台API的限制,这是不可能的

但是,您可以计算与API中存在的颜色最接近的颜色

static ConsoleColor ClosestConsoleColor(byte r, byte g, byte b)
{
    ConsoleColor ret = 0;
    double rr = r, gg = g, bb = b, delta = double.MaxValue;

    foreach (ConsoleColor cc in Enum.GetValues(typeof(ConsoleColor)))
    {
        var n = Enum.GetName(typeof(ConsoleColor), cc);
        var c = System.Drawing.Color.FromName(n == "DarkYellow" ? "Orange" : n); // bug fix
        var t = Math.Pow(c.R - rr, 2.0) + Math.Pow(c.G - gg, 2.0) + Math.Pow(c.B - bb, 2.0);
        if (t == 0.0)
            return cc;
        if (t < delta)
        {
            delta = t;
            ret = cc;
        }
    }
    return ret;
}
静态控制台颜色关闭控制台颜色(字节r、字节g、字节b)
{
控制台颜色ret=0;
双rr=r,gg=g,bb=b,delta=double.MaxValue;
foreach(Enum.GetValues中的ConsoleColor cc(typeof(ConsoleColor)))
{
var n=Enum.GetName(typeof(ConsoleColor),cc);
var c=System.Drawing.Color.FromName(n==“DarkYellow”?“Orange”:n);//错误修复
var t=数学功率(c.R-rr,2.0)+数学功率(c.G-gg,2.0)+数学功率(c.B-bb,2.0);
如果(t==0.0)
返回cc;
if(t

这是来自:credits all to@Glenn

,它将数字转换为颜色,但我如何才能让它与整个十六进制值一起工作?@IKDev我更新了我的代码,将十六进制值转换为整数。它允许您仅使用allready现有控制台颜色的十六进制值,还是也可以与自定义十六进制值一起工作?请注意,“十六进制”在此答案中,与将RGB(255、255、255)值写入十六进制(FFFFFF)无关-因为答案试图解释
ConsoleColor
enum
,所以任何
enum
都可以强制转换为
整数,这个答案告诉你如何将一个
十六进制
转换成一个
整数
,然后再转换成
枚举
。据我所知,你只能使用这个枚举暴露的颜色。可能有一个Pinvoke允许RGB颜色,但我不太确定。很遗憾,你不能使用十六进制值。我的意思是,这是最接近我想要实现的。但我意识到你实际上不能使用十六进制值或任何其他颜色,而只能使用ConsoleColor中的颜色