Saltar al contenido

Color de texto personalizado en la aplicación de consola C #?

Nuestro team de redactores ha pasado mucho tiempo investigando respuestas a tus búsquedas, te regalamos la resolución por eso esperamos resultarte de mucha ayuda.

Solución:

La lista que 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 hexadecimal.

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

EDITAR

Obtener los archivos del proyecto de trabajo de mi repositorio público

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

Pero en una investigación más profunda, puede hacer mucho trabajo para combinar el rojo y el amarillo para obtener el naranja. Siga el ejemplo aquí. No voy a volver a publicar el muro de código. http://support.microsoft.com/kb/319883
Eso no le da acceso a más colores, pero lo lleva en la dirección correcta. Necesitará hacer un trabajo de PINVOKE, pero pude obtener fácilmente el naranja o cualquier otro color RGB en la consola. 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;
    

Y luego, si desea usar Orange 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.
    

[Shameless self-promotion]

Estoy trabajando en un proyecto que le permite diseñar 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/

Desde la actualización de aniversario de Windows 10, la consola puede usar códigos de color ANSI / VT100

  1. Necesita establecer la bandera ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) por SetConsoleMode
  2. Usar secuencias:

    "x1b[48;5;" + s + "m" - establecer el color de fondo por índice en la tabla (0-255)

    "x1b[38;5;" + s + "m" - establecer el color de primer plano por índice en la tabla (0-255)

    "x1b[48;2;" + r + ";" + g + ";" + b + "m" - establecer el fondo por los valores r, g, b

    "x1b[38;2;" + r + ";" + g + ";" + b + "m" - establecer el primer plano por los valores r, g, b

Noticia importante: Internamente, Windows tiene solo 256 (u 88) colores en la tabla y Windows se usará más cercano al 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 )
         0x4 );

            for (int i=0;i<255;i++ )
            
                Console.Write( "x1b[48;5;" + i + "m*" );
            

            Console.ReadLine();
        
    

Resultado:

Colores de Windows 10

Lea sobre esto en MSDN: Artículo 'Secuencias de terminal virtual de consola'

Si te gusta la programación, eres capaz de dejar un tutorial acerca de qué le añadirías a este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *