将文本装饰添加到控制台输出

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

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

谢谢,PaulH

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

可以使用类型转换将这些属性设置为自定义值(即未由ConsoleColor定义的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(十进制175)是一个“文本艺术”字符,表示字符空间顶部的边框。 如果你在文本下面的行中使用那些,那么presto,下划线。

更改控制台的前景/背景颜色非常容易: http : //www.dotnetperls.com/console-color但AFAIK没有办法放置一些粗体文本,例如。 但我并没有真正尝试实现这一目标,所以我不确定。

我用这个代码。 这是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"); } 

这将使用带下划线的文本,并且具有不重置您设置的任何颜色的好处。