C#控制台应用程序中的自定义文本颜色?

C#控制台应用程序中的自定义文本颜色?,c#,visual-studio,console,console-application,textcolor,C#,Visual Studio,Console,Console Application,Textcolor,我刚刚完成了一个项目的C#控制台应用程序代码,希望为我的字体添加一些颜色。我希望能够使用自定义颜色-橙色。有没有办法做到这一点 这是我过去用来更改颜色的代码,但它不提供橙色: Console.ForegroundColor = ConsoleColor.Magenta(and so on); 有没有办法为颜色或类似的东西插入十六进制值?控制台API不支持自定义颜色 您可以通过UI(右键单击控制台标题栏、设置、颜色)控制台API不支持自定义颜色 您可以通过UI(右键单击控制台标题栏、设置、颜色)

我刚刚完成了一个项目的C#控制台应用程序代码,希望为我的字体添加一些颜色。我希望能够使用自定义颜色-橙色。有没有办法做到这一点

这是我过去用来更改颜色的代码,但它不提供橙色:

Console.ForegroundColor = ConsoleColor.Magenta(and so on);

有没有办法为颜色或类似的东西插入十六进制值?

控制台API不支持自定义颜色


您可以通过UI(右键单击控制台标题栏、设置、颜色)

控制台API不支持自定义颜色

您可以通过UI(右键单击控制台标题栏、设置、颜色)

我相信是控制台中唯一支持的颜色。不允许使用十六进制

Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
编辑

从我的公共回购中获取工作项目文件

但在进一步的调查中,你可以做很多工作,把红色和黄色结合起来,得到橙色。按照这里的例子。不打算重新张贴代码墙。 这不会让你获得更多的颜色,但会引导你走向正确的方向。你们将需要做一些PINVOKE的工作,但我很容易就可以得到橙色,或任何其他RGB颜色的控制台。

该列表位于

我相信是控制台中唯一支持的颜色。不允许使用十六进制

Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
编辑

从我的公共回购中获取工作项目文件

但在进一步的调查中,你可以做很多工作,把红色和黄色结合起来,得到橙色。按照这里的例子。不打算重新张贴代码墙。 这不会让你获得更多的颜色,但会引导你走向正确的方向。你们将需要做一些PINVOKE的工作,但我很容易就可以得到橙色,或任何其他RGB颜色的控制台。


它不是橙色,因为该颜色不是console支持的颜色之一。我的意思是,即使使用windows API,您也无法获得它。如果要验证它,请查看以下代码:

   public static class Win32
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput, short attributes);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr GetStdHandle(int nStdHandle);
    }

    public class Program
    {
        static void Main(string[] args)
        {
            foreach(var i in Enumerable.Range(0, 100)) // why "100"? it is just any number
            {
                Win32.SetConsoleTextAttribute(Win32.GetStdHandle(-11), (short)i);
                Console.WriteLine("Hello");
            }
        }
    }

它不是橙色,因为该颜色不是console支持的颜色之一。我的意思是,即使使用windows API,您也无法获得它。如果要验证它,请查看以下代码:

   public static class Win32
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput, short attributes);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern IntPtr GetStdHandle(int nStdHandle);
    }

    public class Program
    {
        static void Main(string[] args)
        {
            foreach(var i in Enumerable.Range(0, 100)) // why "100"? it is just any number
            {
                Win32.SetConsoleTextAttribute(Win32.GetStdHandle(-11), (short)i);
                Console.WriteLine("Hello");
            }
        }
    }

进一步证明这不起作用(使用Benjamin链接中的方法):


此方法不允许您添加任何无法通过ConsoleColor访问的内容。这真是太遗憾了,因为我也想在我的应用程序中添加橙色。如果有人找到了一种方法,我会非常感兴趣。

进一步证明这是行不通的(使用Benjamin链接中的方法):


此方法不允许您添加任何无法通过ConsoleColor访问的内容。这真是太遗憾了,因为我也想在我的应用程序中添加橙色。如果有人找到了一种方法,我会非常感兴趣。

迟做总比不做好,但现在看来这是可能的,至少在Vista和更高版本上是如此。因此,我将添加此内容,以供将来有相同问题的其他人参考

当我打算这么做的时候,我遇到了Hans Passant的:

我现在无法访问Vista,因此无法尝试。但是 这样应该行得通:

CONSOLE_SCREEN_BUFFER_INFOEX info;
info.cbSize = sizeof(info);
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfoEx(hConsole, &info);
info.ColorTable[14] = RGB(255, 128, 0);  // Replace yellow
SetConsoleScreenBufferInfoEx(hConsole, &info);
SetConsoleTextAttribute(hConsole, FOREGROUNDINTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);

这将需要一点p调用,但应该会给你一些东西继续下去。

晚做总比不做好,但现在看来这是可能的,至少在Vista和更高版本上是如此。因此,我将添加此内容,以供将来有相同问题的其他人参考

当我打算这么做的时候,我遇到了Hans Passant的:

我现在无法访问Vista,因此无法尝试。但是 这样应该行得通:

CONSOLE_SCREEN_BUFFER_INFOEX info;
info.cbSize = sizeof(info);
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfoEx(hConsole, &info);
info.ColorTable[14] = RGB(255, 128, 0);  // Replace yellow
SetConsoleScreenBufferInfoEx(hConsole, &info);
SetConsoleTextAttribute(hConsole, FOREGROUNDINTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
这将需要一点p-调用,但应该会给你一些东西继续下去。

你可以使用它,它可以让你使用自定义颜色,甚至有Figlet字体,让你产生ASCII艺术

您可以使用它来使用自定义颜色,甚至可以使用Figlet字体来制作ASCII艺术


自从Windows 10周年更新以来,控制台可以使用ANSI/VT100颜色代码

  • 您需要通过SetConsoleMode设置标志启用虚拟终端处理(0x4)
  • 使用顺序:

    “\x1b[48;5;”+s+“m”
    -按表(0-255)中的索引设置背景色

    “\x1b[38;5;”+s+“m”
    -按表(0-255)中的索引设置前景色

    “\x1b[48;2;“+r+”;“+g+”;“+b+”m”
    -通过r、g、b值设置背景

    “\x1b[38;2;“+r+”;“+g+”;“+b+”m”
    -通过r、g、b值设置前景

  • 重要提示:内部窗口在表中只有256(或88)种颜色,窗口将使用最接近表中(r、g、b)值的颜色

    示例代码:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            [DllImport( "kernel32.dll", SetLastError = true )]
            public static extern bool SetConsoleMode( IntPtr hConsoleHandle, int mode );
            [DllImport( "kernel32.dll", SetLastError = true )]
            public static extern bool GetConsoleMode( IntPtr handle, out int mode );
    
            [DllImport( "kernel32.dll", SetLastError = true )]
            public static extern IntPtr GetStdHandle( int handle );
    
            static void Main( string[] args )
            {
                var handle = GetStdHandle( -11 );
                int mode;
                GetConsoleMode( handle, out mode );
                SetConsoleMode( handle, mode | 0x4 );
    
                for (int i=0;i<255;i++ )
                {
                    Console.Write( "\x1b[48;5;" + i + "m*" );
                }
    
                Console.ReadLine();
            }
        }
    }
    
    使用系统;
    使用System.Collections.Generic;
    使用System.IO;
    使用System.Linq;
    使用System.Runtime.InteropServices;
    使用系统文本;
    使用System.Threading.Tasks;
    名称空间控制台EAPP1
    {
    班级计划
    {
    [DllImport(“kernel32.dll”,SetLastError=true)]
    公共静态外部bool SetConsoleMode(IntPtr hConsoleHandle,int模式);
    [DllImport(“kernel32.dll”,SetLastError=true)]
    公共静态外部bool GetConsoleMode(IntPtr句柄,out int模式);
    [DllImport(“kernel32.dll”,SetLastError=true)]
    公共静态外部IntPtr GetStdHandle(inthandle);
    静态void Main(字符串[]参数)
    {
    var handle=GetStdHandle(-11);
    int模式;
    GetConsoleMode(句柄,输出模式);
    SetConsoleMode(手柄,模式| 0x4);
    
    对于(int i=0;i自Windows 10周年更新以来,控制台可以使用ANSI/VT100颜色代码

  • 您需要通过SetConsoleMode设置标志启用虚拟终端处理(0x4)
  • 使用顺序:

    “\x1b[48;5;”+s+“m”
    -按表(0-255)中的索引设置背景色

    “\x1b[38;5;”+s+“m”
    -按表(0-255)中的索引设置前景色

    “\x1b[48;2;“+r+”;“+g+”;”
    
    using System;
    using Microsoft.Win32;
    
    namespace colorChanger
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Hello World");
                RegistryKey regKey = Registry.CurrentUser.CreateSubKey("Console");
                regKey.SetValue("ColorTable10", 42495, RegistryValueKind.DWord);
                Console.ReadKey();
            }
        }
    }