Colore del testo arancione nell’applicazione console C #?

Ho appena finito il codice dell’applicazione della console C # per un progetto e vorrei aggiungere un po ‘di colore al mio font. Mi piacerebbe poter usare il colore arancione. C’è un modo per fare questo?

Questo è il codice che ho usato per cambiare i colors in passato, ma non offre l’arancione:

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

C’è un modo per inserire magari un valore esadecimale per il colore o qualcosa di simile?

L’elenco trovato su http://msdn.microsoft.com/en-us/library/system.console.backgroundcolor.aspx

Credo che siano gli unici colors supportati in console. Nessun esagono consentito.

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

MODIFICARE

Scarica i file del progetto di lavoro dal mio Repo pubblico

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

Ma su ulteriori indagini puoi fare molto lavoro per combinare rosso e giallo per ottenere l’arancione. Segui l’esempio qui. Non intenzione di ri-pubblicare il muro di codice. http://support.microsoft.com/kb/319883 Che non ti dà accesso a più colors ma che conduce nella direzione corretta. Dovrai fare un po ‘di lavoro con PINVOKE ma sono stato in grado di ottenere facilmente arancione o qualsiasi altro colore RGB nella console. 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; } } 

E poi se vuoi usare Orange o qualsiasi altro colore puoi fare una semplice chiamata a 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. } 

[Autopromozione spudorata]

Sto lavorando a un progetto che ti consente di creare l’output della console in qualsiasi System.Drawing.Color, incluso l’arancione. Ecco come lo faresti:

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

Progetto: http://colorfulconsole.com/

Dall’aggiornamento per l’anniversario di Windows 10, la console può utilizzare i codici colore ANSI / VT100

  1. È necessario impostare il flag ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) di SetConsoleMode
  2. Usa sequenze:

    “\ X1B [48; 5;” + s + “m” – imposta il colore di sfondo per indice nella tabella (0-255)

    “\ X1B [38; 5;” + s + “m” – imposta il colore di primo piano per indice nella tabella (0-255)

    “\ X1B [48; 2;” + r + “;” + g + “;” + b + “m” – imposta lo sfondo con i valori r, g, b

    “\ X1B [38; 2;” + r + “;” + g + “;” + b + “m” – imposta in primo piano i valori r, g, b

Avviso impotante: internamente Windows ha solo 256 (o 88) colors nella tabella e Windows verrà utilizzato più vicino al valore (r, g, b) dalla tabella.

Codice d’esempio:

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

Risultato:

Windows 10 colori

Leggilo su MSDN: Articolo "Sequenze di terminali virtuali della console"

Meglio tardi che mai, ma sembra che ora sia ansible, su Vista e in seguito almeno. Quindi aggiungerò questo per riferimento futuro per gli altri con la stessa domanda.

Quando stavo cercando di farlo, ho trovato la risposta di Hans Passant su MSDN :

Al momento non ho accesso a Vista, quindi non posso provarlo. Ma qualcosa del genere dovrebbe funzionare:

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

Ci vorrà un po ‘di p-Invocazione ma dovrebbe darti qualcosa con cui andare avanti.

Espansione della risposta di Alexei Shcherbakov Windows 10 ENABLE_VIRTUAL_TERMINAL_PROCESSING qui è una mapping completa del codice colore in modo da avere tutti i colors e i rispettivi numeri in un unico punto:

inserisci la descrizione dell'immagine qui

Puoi usare Colorful.Console che ti permette di usare colors personalizzati e ha persino i font Figlet che ti permettono di produrre arte ASCII!

Esempio di Colorful.Console

Non è arancione perché quel colore non è uno dei colors supportati per la console. Voglio dire, non puoi ottenerlo neanche usando Windows API. Se vuoi verificarlo, dai un’occhiata al seguente codice:

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

Un’ulteriore prova non funziona (usando l’approccio nel collegamento di 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 } } } 

Questo metodo non ti consente di aggiungere nulla che non può essere raggiunto tramite ConsoleColor. È un vero peccato perché anch’io mi piacerebbe aggiungere l’arancione alla mia app. Se qualcuno avesse trovato un modo, sarei molto interessato.

L’API della console non supporta i colors personalizzati.

Puoi farlo tramite l’interfaccia utente (fai clic con il pulsante destro del mouse sulla barra del titolo della console, Impostazioni, Colori)