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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将文本装饰添加到控制台输出相关的知识,希望对你有一定的参考价值。

我有一个c#.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定义的值)。但我不知道你会有什么好处。

我不知道我曾经在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");
    }
}

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

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

以上是关于将文本装饰添加到控制台输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将java控制台的输出内容存入到文本文件中

将 webview 添加到 sherlock 片段中

在 SwiftUI 中装饰文本片段的最佳方法是啥?

文件输出到记事本 .txt

如何正确地将多个片段添加到片段过渡?

Eclipse MyEclipse Scala IDEA for Eclipse里如何将控制台console输出的过程记录全程保存到指定的文本文件(图文详解)