usar - console.backgroundcolor c#
¿Color de texto naranja en la aplicación de la consola C#? (9)
Acabo de terminar mi código de aplicación de consola C # para un proyecto y me gustaría agregar algo de color a mi fuente. Me encantaría poder usar el color naranja. ¿Hay alguna manera de hacer esto?
Este es el código que he estado utilizando para cambiar los colores en el pasado, pero no ofrece naranja:
Console.ForegroundColor = ConsoleColor.Magenta(and so on);
¿Hay alguna manera de tal vez insertar un valor hexadecimal para el color o algo similar?
Desde Windows 10 Anniversary Update, la consola puede usar códigos de color ANSI / VT100
- Necesita set flag ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) por SetConsoleMode
Usa secuencias:
"/ x1b [48; 5;" + s + "m" - establece el color de fondo por índice en la tabla (0-255)
"/ x1b [38; 5;" + s + "m" - establece el color de primer plano por índice en la tabla (0-255)
"/ x1b [48; 2;" + r + ";" + g + ";" + b + "m" - establece el fondo por los valores r, g, b
"/ x1b [38; 2;" + r + ";" + g + ";" + b + "m" - establecer en primer plano por r, g, b valores
Aviso imprudente: internamente Windows tiene solo 256 (u 88) colores en la tabla y Windows se usará más cerca del valor (r, g, b) de la tabla.
Código de muestra:
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();
}
}
}
Resultado:
Lea sobre esto en MSDN: Artículo ''Secuencias de terminales virtuales de consola''
La consola API no admite colores personalizados.
Puede hacerlo a través de la IU (haga clic con el botón derecho en la barra de título de la consola, Configuración, Colores)
La lista se encuentra en http://msdn.microsoft.com/en-us/library/system.console.backgroundcolor.aspx
Creo que son los únicos colores admitidos en la consola. No se permite hex.
Black
DarkBlue
DarkGreen
DarkCyan
DarkRed
DarkMagenta
DarkYellow
Gray
DarkGray
Blue
Green
Cyan
Red
Magenta
Yellow
White
EDITAR
Obtenga los archivos del proyecto de trabajo de mi Repo público
https://bitbucket.org/benskolnick/color-console/
Pero en investigaciones posteriores puede hacer mucho trabajo para combinar rojo y amarillo para obtener naranja. Sigue el ejemplo aquí. No va a volver a publicar el muro de código. support.microsoft.com/kb/319883 Eso no le da acceso a más colores pero conduce en la dirección correcta. Necesitarás hacer un poco de trabajo PINVOKE pero pude obtener fácilmente naranja, o cualquier otro color RGB en la consola. 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;
}
}
Y luego, si desea usar Naranja o cualquier otro color, puede hacer una simple llamada 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 i.e. 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.
}
Más vale tarde que nunca, pero parece que esto ahora es posible, en Vista y más tarde al menos. Así que agregaré esto para referencia futura para otros con la misma pregunta.
Cuando estaba buscando hacerlo, encontré la respuesta de Hans Passant en MSDN :
No tengo acceso a Vista ahora mismo, así que no puedo probarlo. Pero algo como esto debería funcionar:
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);
Tomará un poco de p-invocando, pero debería darle algo con lo que continuar.
No naranja porque ese color no es uno de los colores compatibles para consola. Quiero decir, no puedes obtenerlo incluso usando Windows API. Si quiere verificarlo, eche un vistazo al siguiente código:
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");
}
}
}
Otra prueba de que esto no funciona (usando el enfoque en el enlace de 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
}
}
}
Este método no le permite agregar nada que no se pueda alcanzar a través de ConsoleColor. Es una verdadera lástima, ya que también me gustaría agregar naranja a mi aplicación. Si alguien ha encontrado una manera, estaría muy interesado.
Puede usar Colorful.Console que le permite usar colores personalizados e incluso tiene fuentes Figlet que le permiten producir arte ASCII.
[Auto-promoción desvergonzada]
Estoy trabajando en un proyecto que te permite personalizar la salida de la consola en cualquier System.Drawing.Color, incluido el naranja. Así es como lo harías:
Console.WriteLine("writing to the console in orange", Color.Orange);
Proyecto: http://colorfulconsole.com/