web-dev-qa-db-fra.com

Couleur du texte orange dans l'application console C #?

Je viens de terminer le code de l'application de la console C # pour un projet et j'aimerais ajouter de la couleur à ma police. J'aimerais pouvoir utiliser la couleur orange. Y a-t-il un moyen de faire ça?

C’est le code que j’ai utilisé pour changer les couleurs dans le passé, mais il n’offre pas d’orange:

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

Est-il possible d'insérer une valeur hexadécimale pour la couleur ou quelque chose de similaire?

29
Thomas

Depuis la mise à jour anniversaire de Windows 10, la console peut utiliser les codes de couleur ANSI/VT100.

  1. Vous devez définir le drapeau ENABLE_VIRTUAL_TERMINAL_PROCESSING (0x4) de SetConsoleMode.
  2. Utilisez des séquences:

    "\ x1b [48; 5;" + s + "m" - définit la couleur de fond par index dans le tableau (0-255)

    "\ x1b [38; 5;" + s + "m" - définit la couleur de premier plan par index dans le tableau (0-255)

    "\ x1b [48; 2;" + r + ";" + g + ";" + b + "m" - définit le fond avec les valeurs r, g, b

    "\ x1b [38; 2;" + r + ";" + g + ";" + b + "m" - place au premier plan les valeurs r, g, b

Remarque importante: En interne, Windows n'a que 256 (ou 88) couleurs dans le tableau et Windows utilisera la valeur la plus proche de (r, g, b) du tableau. 

Exemple de code:

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

Résultat:

 Windows 10 Colors

Lisez à ce sujet dans MSDN: Article 'Console Virtual Terminal Squences'

9
Alexei Shcherbakov

Développant la réponse d’Alexei Shcherbakov Windows 10 ENABLE_VIRTUAL_TERMINAL_PROCESSING, voici un mappage complet du code de couleur afin que toutes les couleurs et leurs numéros respectifs se trouvent au même endroit:

 enter image description here

3
Jenny

Mieux vaut tard que jamais, mais il semble que cela soit maintenant possible, au moins pour Vista. Je vais donc ajouter ceci pour référence future pour les autres avec la même question.

Lorsque je cherchais à faire cela, je suis tombé sur la réponse de Hans Passant sur MSDN :

Je n'ai pas accès à Vista pour le moment, donc je ne peux pas l'essayer. Mais quelque chose comme cela devrait fonctionner:

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

Cela prendra un peu de p-invoquer mais devrait vous donner quelque chose à continuer.

3
Ash

Vous pouvez utiliser Colorful.Console qui vous permet d'utiliser des couleurs personnalisées et même des polices Figlet qui vous permettent de produire de l'art ASCII!

 Colorful.Console Example

2

Une autre preuve que cela ne fonctionne pas (en utilisant l'approche dans le lien 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
        }
    }
}

Cette méthode ne vous permet pas d'ajouter quoi que ce soit qui ne peut pas être atteint via ConsoleColor. C'est vraiment dommage car j'aimerais aussi ajouter de l'orange à mon application. Si quelqu'un a trouvé un moyen, je serais très intéressé.

1
Simon

Il ne s’agit pas d’orange car cette couleur ne fait pas partie des couleurs prises en charge par la console. Je veux dire, vous ne pouvez pas l'obtenir même en utilisant l'API Windows. Si vous voulez le vérifier, jetez un coup d'œil au code suivant:

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

un peu tard, je sais. Cependant, un moyen d'obtenir des couleurs qui ne sont normalement pas disponibles dans la console C # consiste à modifier le ColorCode d'une couleur dans le registre. Mais attention, c’est probablement le moyen le plus inacceptable de le faire ..__ Ouvrez simplement regedit (Win + R, puis tapez "regedit"), allez à HKEY_CURRENT_USER, ouvrez la clé "Console" (à ce stade, vous devez exporter "Console" pour le restaurer plus tard). Vous y verrez une liste de valeurs de ColorTable00 à ColoTable15. Si vous changez ColorTable10 de 0x0000ff00 à 0x0000a5ff (ou 65280 à 42495), vous aurez une couleur orange lorsque vous utilisez ConsoleColor.Green dans la console après le redémarrage. Vous pouvez également changer cette valeur par code

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

Bien sûr, cela fonctionne avec tous les autres ColorTable-Values ​​et Colorcodes mais cela ne change que pour votre utilisateur sur votre PC.

0
fly_over_32