C# 向控制台输出添加文本装饰

C# 向控制台输出添加文本装饰,c#,console,ansi,text-decorations,C#,Console,Ansi,Text Decorations,我有一个c#.net 3.5应用程序,它使用StreamWriter将文本写入控制台。是否有一种方法可以将下划线和删除线等文本装饰添加到打印到控制台的文本中?可能使用ANSI转义序列 TextWriter writer = new StreamWriter(Console.OpenStandardOutput()); writer.WriteLine("some underlined text"); 谢谢, PaulH更改console的前/背景颜色非常容易:但是,例如,没有办法放置一些粗体文

我有一个c#.net 3.5应用程序,它使用StreamWriter将文本写入控制台。是否有一种方法可以将下划线和删除线等文本装饰添加到打印到控制台的文本中?可能使用ANSI转义序列

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

更改console的前/背景颜色非常容易:但是,例如,没有办法放置一些粗体文本。但我并没有真正尝试去实现这一点,所以我不确定;控制台不允许在输出中使用带下划线的字符

更详细的回答:控制台使用的屏幕缓冲区只不过是一个字节数组。每个光标位置是一个字节或一个字符。要创建下划线,要么需要两个字符重叠(这在控制台中是不可能的),要么需要访问使用上128个字符值作为下128个字符值的下划线或删除线版本的代码页(我不知道有一个)


如果您愿意对有下划线的行使用“双倍行距”,则可以解决此问题。字符代码0x00AF(十进制175)是一个“文本艺术”字符,表示字符空间顶部的边框。如果您在文本下方的行中使用这些字符,请使用presto和下划线。

Windows控制台不支持ANSI转义序列。据我所知,更改输出字符属性的唯一方法是在写入字符之前调用
SetConsoleTextAttribute
。或者,在.NET中,修改
Console.ForegroundColor
Console.BackgroundColor
属性

可以使用类型转换将这些属性设置为自定义值(即,
ConsoleColor
未定义的值)。但我不知道这对你有什么好处


我不知道我曾经在Windows控制台上看到过删除线文本,我已经好几年没有看到下划线了。我想这是可能的,但我不知道是怎么做到的。

在Windows 10 build 16257及更高版本中:

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

我使用这个代码。这是Vladimir Reshetnikov答案的固定版本,使用正确的转义码重置

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

这将处理带下划线的文本,并且不会重置您设置的任何颜色。

仅供参考:
ConsoleColor
调用的
White
实际上是“粗体灰色”,就其转换为Windows API调用的方式而言。基本上,8种“亮”色是设置了
前照强度
背景强度
位的“暗”色。看,对不起,我没有工作。。我错过什么了吗?好吧,问题是我把常数改成了六,保持习惯!谢谢:)你知道除了下划线,我在哪里可以找到所有其他的格式功能吗?