专栏首页walterlv - 吕毅的博客让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

发布于 2018-08-05 06:24 更新于 2018-09-01 00:15

各种操作系统的控制台都支持 ANSI 转义序列(ANSI Escape Code)。使用转义序列,可以对控制台进行很多额外的定制,例如修改颜色、修改标题栏,将文字添加下划线等。

当然,.NET 已经帮助我们封装了很大的一部分功能了,我们重点可以放在 .NET 没有封装的那部分上。


基本的准备代码

在开始之前,我们先添加一些基础性代码,这是对系统核心功能的调用。

const int STD_OUTPUT_HANDLE = -11;
const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004;

[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);

在 Main 函数中,添加一些调用:

static void Main(string[] args)
{
    Console.Title = "Walterlv.Demo";

    var handle = GetStdHandle(STD_OUTPUT_HANDLE);
    GetConsoleMode(handle, out var mode);
    mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
    SetConsoleMode(handle, mode);

    // 我们准备在这里添加新的代码。
    
    Console.Read();
}

开始使用 ANSI 转义序列

添加下划线

const string UNDERLINE = "\x1B[4m";
const string RESET = "\x1B[0m";
Console.WriteLine($"Some {UNDERLINE}underlined{RESET} text");

▲ 下划线转义

修改颜色

const string RED = "\x1B[31m";
Console.WriteLine($"Some {UNDERLINE}underlined{RESET} and {RED}red{RESET} text");

▲ 颜色转义(当然,.NET 封装有 API)

其他转义序列

其他转义序列,可阅读 ANSI escape code - Wikipedia。不过 Windows 能支持的并不多。

关于颜色,不同控制台上对于相同转义序列的颜色值和颜色支持程度也不同。

关于 ENABLE_VIRTUAL_TERMINAL_PROCESSING

这是用来开启虚拟终端处理的一个标识,Windows 从一开始就默认关闭这个标识,必须通过 SetConsoleMode 手工开启。虽然在 10.0.10586 版本时短暂开启了一个版本,随后在 10.0.14393 中又再次默认关闭了。


参考资料

本文会经常更新,请阅读原文: https://walterlv.com/post/enable-virtual-terminal-processing.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 吕毅 (包含链接: https://walterlv.com ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 (walter.lv@qq.com)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 配置 legacyUnhandledExceptionPolicy 防止后台线程抛出的异常让程序崩溃退出

    发布于 2017-10-16 12:52 更新于 2017-10...

    walterlv
  • .NET 中创建支持集合初始化器的类型

    对象初始化器和集合初始化器只是语法糖,但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开,可读性会好一些。

    walterlv
  • 使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(解析篇)

    OPML 全称是 Outline Processor Markup Language ,即 大纲处理标记语言。目前流行于收集博客的 RSS 源,便于用户转移自己...

    walterlv
  • NOLO CV1 &Pico G2套装上架天猫,无线VR畅享视觉和体感盛宴

    近日,NOLO CV1 &PicoG2套装正式上架Pico天猫旗舰店,比原价购买两个单品优惠近300元,仅需2999元即可在家中即可享受Pico G2出色的观影...

    VRPinea
  • 6款功能特色各异的电路仿真软件,你都用过哪几款?

    电路仿真,顾名思义就是设计好的电路图通过仿真软件进行实时模拟,模拟出实际功能,然后通过其分析改进,从而实现电路的优化设计。是EDA(电子设计自动化)...

    MCU起航
  • Teamcenter RAC 查找数据集并获取数据集中文件

    路过君
  • JAVA IO

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/suifeng3051/article/details/483...

    阮键
  • FilenameFilter 实现文件过滤

    实现 FilenameFilter 接口的类的实例用于过滤文件名。这些实例被用来过滤类 File 的 list 方法中的目录列表。FilenameFilter ...

    cxuan
  • 基于ZYNQ的SOC——Hellow_World实验

      ZYNQ是一款SOC芯片,之前使用VGA做过的实验只是PL(Programmable Logic)部分,而ZYNQ最突出的功能,就是内部的双核Cortex-...

    NingHeChuan
  • 开源.NET邮件服务器

    LumiSoft Mail Server是一个开源,免费的邮件服务器,能运行在.net/mono上,支持SMTP/POP3/IMAP4/WebMail,支持MS...

    张善友

扫码关注云+社区

领取腾讯云代金券