C#控制台应用程序中的橙色文字颜色?

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

这是我以前用来改变颜色的代码,但它不提供橙色:

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

有没有办法可能插入一个hex值的颜色或类似的东西?

该列表在http://msdn.microsoft.com/en-us/library/system.console.backgroundcolor.aspx

我相信是控制台中唯一支持的颜色。 不允许hex。

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

编辑

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

https://bitbucket.org/benskolnick/color-console/

但进一步调查你可以做很多工作,结合红色和黄色变成橙色。 按照这里的例子。 不会重新发布代码的墙。 http://support.microsoft.com/kb/319883这不会让您访问更多的颜色,但确实导致了正确的方向。 你需要做一些PINVOKE工作,但是我很容易就能把橙色或者任何其他的RGB色彩input到控制台中。 http://pinvoke.net/default.aspx/kernel32.SetConsoleScreenBufferInfoEx

 // Copyright Alex Shvedov // Modified by MercuryP with color specifications // Use this code in any way you want using System; using System.Diagnostics; // for Debug using System.Drawing; // for Color (add reference to System.Drawing.assembly) using System.Runtime.InteropServices; // for StructLayout class SetScreenColorsApp { [StructLayout(LayoutKind.Sequential)] internal struct COORD { internal short X; internal short Y; } [StructLayout(LayoutKind.Sequential)] internal struct SMALL_RECT { internal short Left; internal short Top; internal short Right; internal short Bottom; } [StructLayout(LayoutKind.Sequential)] internal struct COLORREF { internal uint ColorDWORD; internal COLORREF(Color color) { ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16); } internal COLORREF(uint r, uint g, uint b) { ColorDWORD = r + (g << 8) + (b << 16); } internal Color GetColor() { return Color.FromArgb((int) (0x000000FFU & ColorDWORD), (int) (0x0000FF00U & ColorDWORD) >> 8, (int) (0x00FF0000U & ColorDWORD) >> 16); } internal void SetColor(Color color) { ColorDWORD = (uint) color.R + (((uint) color.G) << 8) + (((uint) color.B) << 16); } } [StructLayout(LayoutKind.Sequential)] internal struct CONSOLE_SCREEN_BUFFER_INFO_EX { internal int cbSize; internal COORD dwSize; internal COORD dwCursorPosition; internal ushort wAttributes; internal SMALL_RECT srWindow; internal COORD dwMaximumWindowSize; internal ushort wPopupAttributes; internal bool bFullscreenSupported; internal COLORREF black; internal COLORREF darkBlue; internal COLORREF darkGreen; internal COLORREF darkCyan; internal COLORREF darkRed; internal COLORREF darkMagenta; internal COLORREF darkYellow; internal COLORREF gray; internal COLORREF darkGray; internal COLORREF blue; internal COLORREF green; internal COLORREF cyan; internal COLORREF red; internal COLORREF magenta; internal COLORREF yellow; internal COLORREF white; } const int STD_OUTPUT_HANDLE = -11; // per WinBase.h internal static readonly IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1); // per WinBase.h [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); // Set a specific console color to an RGB color // The default console colors used are gray (foreground) and black (background) public static int SetColor(ConsoleColor consoleColor, Color targetColor) { return SetColor(consoleColor, targetColor.R, targetColor.G, targetColor.B); } public static int SetColor(ConsoleColor color, uint r, uint g, uint b) { CONSOLE_SCREEN_BUFFER_INFO_EX csbe = new CONSOLE_SCREEN_BUFFER_INFO_EX(); csbe.cbSize = (int)Marshal.SizeOf(csbe); // 96 = 0x60 IntPtr hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE); // 7 if (hConsoleOutput == INVALID_HANDLE_VALUE) { return Marshal.GetLastWin32Error(); } bool brc = GetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe); if (!brc) { return Marshal.GetLastWin32Error(); } switch (color) { case ConsoleColor.Black: csbe.black = new COLORREF(r, g, b); break; case ConsoleColor.DarkBlue: csbe.darkBlue = new COLORREF(r, g, b); break; case ConsoleColor.DarkGreen: csbe.darkGreen = new COLORREF(r, g, b); break; case ConsoleColor.DarkCyan: csbe.darkCyan = new COLORREF(r, g, b); break; case ConsoleColor.DarkRed: csbe.darkRed = new COLORREF(r, g, b); break; case ConsoleColor.DarkMagenta: csbe.darkMagenta = new COLORREF(r, g, b); break; case ConsoleColor.DarkYellow: csbe.darkYellow = new COLORREF(r, g, b); break; case ConsoleColor.Gray: csbe.gray = new COLORREF(r, g, b); break; case ConsoleColor.DarkGray: csbe.darkGray = new COLORREF(r, g, b); break; case ConsoleColor.Blue: csbe.blue = new COLORREF(r, g, b); break; case ConsoleColor.Green: csbe.green = new COLORREF(r, g, b); break; case ConsoleColor.Cyan: csbe.cyan = new COLORREF(r, g, b); break; case ConsoleColor.Red: csbe.red = new COLORREF(r, g, b); break; case ConsoleColor.Magenta: csbe.magenta = new COLORREF(r, g, b); break; case ConsoleColor.Yellow: csbe.yellow = new COLORREF(r, g, b); break; case ConsoleColor.White: csbe.white = new COLORREF(r, g, b); break; } ++csbe.srWindow.Bottom; ++csbe.srWindow.Right; brc = SetConsoleScreenBufferInfoEx(hConsoleOutput, ref csbe); if (!brc) { return Marshal.GetLastWin32Error(); } return 0; } public static int SetScreenColors(Color foregroundColor, Color backgroundColor) { int irc; irc = SetColor(ConsoleColor.Gray, foregroundColor); if (irc != 0) return irc; irc = SetColor(ConsoleColor.Black, backgroundColor); if (irc != 0) return irc; return 0; } } 

然后,如果你想使用橙色或任何其他颜色,你可以做一个简单的调用SetScreenColor

 static void Main(string[] args) { Color screenTextColor = Color.Orange; Color screenBackgroundColor = Color.Black; int irc = SetScreenColorsApp.SetScreenColors(screenTextColor, screenBackgroundColor); Debug.Assert(irc == 0, "SetScreenColors failed, Win32Error code = " + irc + " = 0x" + irc.ToString("x")); Debug.WriteLine("LargestWindowHeight=" + Console.LargestWindowHeight + " LargestWindowWidth=" + Console.LargestWindowWidth); Debug.WriteLine("BufferHeight=" + Console.BufferHeight + " WindowHeight=" + Console.WindowHeight + " BufferWidth=" + Console.BufferWidth + " WindowWidth=" + Console.WindowWidth); //// these are relative to the buffer, not the screen: //Debug.WriteLine("WindowTop=" + Console.WindowTop + " WindowLeft=" + Console.WindowLeft); Debug.WriteLine("ForegroundColor=" + Console.ForegroundColor + " BackgroundColor=" + Console.BackgroundColor); Console.WriteLine("Some text in a console window"); Console.BackgroundColor = ConsoleColor.Cyan; Console.ForegroundColor = ConsoleColor.Yellow; Debug.WriteLine("ForegroundColor=" + Console.ForegroundColor + " BackgroundColor=" + Console.BackgroundColor); Console.Write("Press ENTER to exit..."); Console.ReadLine(); // Note: If you use SetScreenColors, the RGB values of gray and black are changed permanently for the console window. // Using ie Console.ForegroundColor = ConsoleColor.Gray afterwards will switch the color to whatever you changed gray to // It's best to use SetColor for the purpose of choosing the 16 colors you want the console to be able to display, then use // Console.BackgroundColor and Console.ForegrondColor to choose among them. } 

[无耻自我推销]

我正在开发一个项目,允许您在任何System.Drawing.Color中设置控制台的输出,包括橙色。 以下是你如何做到这一点:

Console.WriteLine("writing to the console in orange", Color.Orange);

项目: http : //colorfulconsole.com/

比从未更好的迟到,但现在看来,这是可能的,至less在Vista和以后。 所以我会join这个为将来的参考为其他同样的问题。

当我想要这样做时,我遇到了Hans Passant 在MSDN上的回复 :

我现在无法访问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-Invoking,但应该给你一些进一步的。

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

  1. 您需要通过SetConsoleMode设置标志ENABLE_VIRTUAL_TERMINAL_PROCESSING(0x4)
  2. 使用序列:

    “\ 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值设置前景

重要提示:内部Windows在表格中只有256(或88)种颜色,Windows将使用距表格最近的(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(); } } } 

结果:

Windows 10颜色

阅读有关它在MSDN:文章“控制台虚拟terminal序列”

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

Colorful.Console示例

它不是橙色,因为该颜色不是控制台支持的颜色之一。 我的意思是,即使使用Windows API也无法获得它。 如果你想validation它,看看下面的一段代码:

  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"); } } } 

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

 using System.Runtime.InteropServices; namespace { class Program { [DllImport("kernel32.dll")] public static extern bool SetConsoleTextAttribute(IntPtr hConsoleOutput, int wAttributes); [DllImport("kernel32.dll")] public static extern IntPtr GetStdHandle(uint nStdHandle); static void Main(string[] args) { uint STD_OUTPUT_HANDLE = 0xfffffff5; IntPtr hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, (int)Colour.Red + (int)Colour.Green + (int)Colour.Intensity); Console.WriteLine("Red + Green + Intensity == Yellow"); SetConsoleTextAttribute(hConsole, (int)Colour.Red + (int)Colour.Green + (int)Colour.Intensity + (int)Colour.Red); Console.WriteLine("Yellow + Red != Orange"); SetConsoleTextAttribute(hConsole, 15); Console.WriteLine(); Console.WriteLine("Press Enter to exit ..."); Console.Read(); } public enum Colour { Blue = 0x00000001, Green = 0x00000002, Red = 0x00000004, Intensity = 0x00000008 } } } 

此方法不允许添加通过ConsoleColor无法达到的任何内容。 这是一个真正的耻辱,我也喜欢在我的应用程序添加橙色。 如果有人find了我会很感兴趣的方法。

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

您可以通过用户界面(右键单击控制台标题栏,设置,颜色)