добавление текстовых украшений в консольный вывод

У меня есть приложение ac # .net 3.5, которое записывает текст в консоль с помощью StreamWriter. Есть ли способ добавить текстовые украшения, такие как подчеркивание и зачеркивание текста, который печатается на консоли? Возможно, используя escape-последовательности ANSI?

TextWriter writer = new StreamWriter(Console.OpenStandardOutput()); writer.WriteLine("some underlined text"); 

Спасибо, PaulH

Консоль Windows не поддерживает escape-последовательности ANSI. Насколько мне известно, единственный способ изменить атрибуты выходного символа – вызвать SetConsoleTextAttribute перед написанием символа. Или в .NET измените атрибуты Console.ForegroundColor или Console.BackgroundColor .

Возможно, можно установить эти свойства в пользовательские значения (т.е. значения, не определенные ConsoleColor ), с типом. Но я не знаю, что хорошего тебе будет.

Я не знаю, что я когда-либо видел зачеркнутый текст на консоли Windows, и прошло много лет с тех пор, как я увидел подчеркивание. Полагаю, это возможно, но я не знаю, как это делается.

 using System; using System.Runtime.InteropServices; class Program { const int STD_OUTPUT_HANDLE = -11; const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4; [DllImport("kernel32.dll", SetLastError = true)] static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll")] static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); static void Main() { var handle = GetStdHandle(STD_OUTPUT_HANDLE); uint mode; GetConsoleMode(handle, out mode); mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(handle, mode); const string UNDERLINE = "\x1B[4m"; const string RESET = "\x1B[0m"; Console.WriteLine("Some " + UNDERLINE + "underlined" + RESET + " text"); } } 

Консоль с подчеркнутым текстом

Короткий ответ, нет; консоль не позволяет использовать подчеркнутые символы на выходе.

Более длинный ответ: буфер экрана, используемый консолью, – это немного больше, чем байтовый массив. Каждая позиция курсора – один байт или один символ. Чтобы создать подчеркивание, вам либо нужно наложить два символа (что невозможно в консоли), либо вам нужен доступ к кодовой странице, которая использует верхние 128 символов в качестве подчеркнутых или зачеркнутых версий нижних 128 (я не знать одно).

Вы можете обойти это, если вы готовы пойти «с двойным интервалом» для линий, которые имеют подчеркивания. Код символа 0x00AF (decimal 175) является символом «text art», представляющим границу в верхней части пространства символов. Если вы используете те, что находятся в строке под вашим текстом, престо, подчеркивает.

Изменить цвет переднего и заднего фона консоли можно довольно просто: http://www.dotnetperls.com/console-color, но AFAIK не существует, например, для выделения жирного текста. Но я действительно не пытался этого добиться, поэтому я не уверен.

Я использую этот код. Это фиксированная версия ответа Владимира Решетникова с использованием правильного кода возврата для сброса.

  private static void WriteUnderline(string s) { var handle = GetStdHandle(STD_OUTPUT_HANDLE); uint mode; GetConsoleMode(handle, out mode); mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; SetConsoleMode(handle, mode); Console.WriteLine($"\x1B[4m{s}\x1B[24m"); } 

Это сделает подчеркнутый текст, и имеет преимущество не сбросить какие-либо цвета, которые вы установили.