Оранжевый цвет текста в приложении консоли С#?

Я только что закончил свой код приложения консоли С# для проекта и хотел бы добавить некоторый цвет к моему шрифту. Я хотел бы иметь возможность использовать оранжевый цвет. Есть ли способ сделать это?

Это код, который я использовал для изменения цветов в прошлом, но он не предлагает оранжевый цвет:

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

Есть ли способ добавить шестнадцатеричное значение для цвета или что-то подобное?

Ответ 1

Список найден в 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 в консоли. 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 i.e. Console.ForegroundColor = ConsoleColor.Gray afterwards will switch the color to whatever you changed gray to

        // It 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.
    }

Ответ 2

[Бесстыдная самореклама]

Я работаю над проектом, который позволяет вам создавать консольный вывод в любом System.Drawing.Color, включая оранжевый. Вот как вы это сделаете:

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

Проект: http://colorfulconsole.com/

Ответ 3

Начиная с обновления Windows 10 Anniversary Update, консоль может использовать цветовые коды ANSI/VT100

  • Вам нужно установить флаг ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) с помощью SetConsoleMode
  • Использовать последовательности:

    "\ 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

Заметка Impotant: Внутренне 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: Статья "Консольные виртуальные терминальные последовательности"

Ответ 4

Лучше поздно, чем никогда, но кажется, что теперь это возможно, на Vista и позже, по крайней мере. Поэтому я добавлю это для будущей справки для других с тем же вопросом.

Когда я искал это, я наткнулся на сообщение 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, но вам нужно что-то продолжать.

Ответ 5

Расширение по ответу Алексея Щербакова Windows 10 ENABLE_VIRTUAL_TERMINAL_PROCESSING - это полное сопоставление цветового кода, поэтому у вас есть все цвета и их соответствующие номера в одном месте:

enter image description here

Ответ 6

Вы можете использовать Colorful.Console, который позволяет использовать пользовательские цвета и даже имеет шрифты Figlet, которые позволяют создавать ASCII-арт!

Colorful.Console Example

Ответ 7

Он не оранжевый, потому что этот цвет не является одним из поддерживаемых цветов для консоли. Я имею в виду, вы не можете получить его даже с помощью API Windows. Если вы хотите проверить его, посмотрите на следующий фрагмент кода:

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

Ответ 8

Дальнейшее доказательство этого не работает (используя подход в ссылке Бенджамина):

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. Это настоящий позор, поскольку я тоже хотел бы добавить оранжевый в мое приложение. Если бы кто-нибудь нашел способ, мне было бы очень интересно.

Ответ 9

Я создал небольшой плагин (доступен на NuGet), который позволяет легко обернуть ваши строки в цветовых кодах ANSI.

enter image description here

Он работает, расширяя объект String, и синтаксис выглядит следующим образом:

"color me".Pastel("#1E90FF");

После этого он готов к использованию любым из методов Console.Write*.

Ответ 10

немного поздно, я знаю. Но один из способов добиться цветов, которые обычно недоступны в С# Console, - это изменить цветовой код цвета в реестре. Но будьте осторожны, это, вероятно, самый неприемлемый способ сделать это. Просто откройте regedit (Win + R, затем наберите "regedit"), перейдите к HKEY_CURRENT_USER, откройте ключ "Консоль" (на этом этапе вы должны экспортировать ключ "Консоль", чтобы восстановить его позже). Там вы увидите список значений от ColorTable00 до ColoTable15. если вы измените, скажем, ColorTable10 с 0x0000ff00 на 0x0000a5ff (или с 65280 на 42495), у вас будет оранжевый цвет при использовании ConsoleColor.Green в консоли после ее перезапуска. Вы также можете изменить это значение по коду

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

Конечно, это работает со всеми другими ColorTable-значениями и цветовыми кодами, но это изменяется только для вашего пользователя на вашем ПК.

Ответ 11

API-интерфейс консоли не поддерживает пользовательские цвета.

Вы можете сделать это через пользовательский интерфейс (щелкните правой кнопкой мыши заголовок панели консоли, настройки, цвета)