Pau*_*ulH 8 c# console ansi text-decorations
我有一个ac#.net 3.5应用程序,它使用StreamWriter将文本写入控制台.有没有办法可以在打印到控制台的文本中添加下划线和删除线等文本装饰?可能使用ANSI转义序列?
TextWriter writer = new StreamWriter(Console.OpenStandardOutput());
writer.WriteLine("some underlined text");
Run Code Online (Sandbox Code Playgroud)
谢谢,PaulH
Vla*_*kov 18
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");
}
}
Run Code Online (Sandbox Code Playgroud)
简短的回答,没有; 控制台不允许在输出中使用带下划线的字符.
更长的答案:控制台使用的屏幕缓冲区只是一个字节数组.每个光标位置是一个字节或一个字符.要创建下划线,您需要重叠两个字符(这在控制台中是不可能的),或者您需要访问使用较高128个字符值的代码页作为低128的下划线或删除线版本(我不知道一个).
如果你愿意为具有下划线的行"双倍间隔",你可以解决这个问题.字符代码0x00AF(十进制175)是一个"文本艺术"字符,表示字符空间顶部的边框.如果您在文本下方的行中使用那些,则presto,下划线.
Windows控制台不支持ANSI转义序列.据我所知,改变输出字符属性的唯一方法是SetConsoleTextAttribute在写字符之前调用.或者,在.NET中,修改Console.ForegroundColor或Console.BackgroundColor属性.
可以使用类型转换将这些属性设置为自定义值(即未定义的值ConsoleColor).但我不知道你会有什么好处.
我不知道我曾经在Windows控制台上看到过删除文本,自从我看到下划线以来已经有好几年了.我想这是可能的,但我不知道它是如何完成的.
我用这个代码。这是 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");
}
Run Code Online (Sandbox Code Playgroud)
这将处理带下划线的文本,并且不会重置您设置的任何颜色。
| 归档时间: |
|
| 查看次数: |
15773 次 |
| 最近记录: |