добавление текстовых декораций к выводу консоли - PullRequest
6 голосов
/ 08 марта 2011

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

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

Спасибо, PaulH

Ответы [ 5 ]

17 голосов
/ 28 марта 2017
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");
    }
}

Console with underlined text

6 голосов
/ 08 марта 2011

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

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

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

6 голосов
/ 08 марта 2011

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

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

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

1 голос
/ 01 сентября 2018

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

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

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

1 голос
/ 08 марта 2011

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

...