【问题标题】:adding text decorations to console output向控制台输出添加文本装饰
【发布时间】:2011-07-11 09:28:24
【问题描述】:

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

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

谢谢, 保罗H

【问题讨论】:

    标签: c# console ansi text-decorations


    【解决方案1】:

    在 Windows 10 内部版本 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");
        }
    }
    

    【讨论】:

    • 抱歉,没有为我工作。我错过了什么吗?
    • Edit 有效,问题是我已将 const 更改为 hexa,保持习惯!谢谢:)
    • 你知道在哪里可以找到除下划线之外的所有其他格式设置功能吗?
    • 不优雅的答案。作为一个 .NET 问题,解决方案不应依赖于操作系统,即使它暗示为 .NET Framework。
    • 我认为不可能以独立于操作系统的方式解决这个问题。某些操作系统(例如早期版本的 Windows)中的终端根本不具备处理 ANSI 代码的能力。 Windows 10 中的控制台支持它们,但可以以特定于操作系统的方式启用和禁用此功能。 en.wikipedia.org/wiki/ANSI_escape_code#DOS,_OS/2,_and_Windows
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      简短的回答,不;控制台不允许在输出中使用下划线字符。

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 仅供参考:ConsoleColor 调用 White 实际上是“粗体灰色”,就如何转换为 Windows API 调用而言。基本上,8 种“亮”色是设置了FOREGROUND_INTENSITYBACKGROUND_INTENSITY 位的“暗”色。见msdn.microsoft.com/en-us/library/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-01
          • 2019-06-04
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          相关资源
          最近更新 更多