tombkeeper 25-10-04 21:43
微博认证:2025微博新锐新知博主 科技博主

和传统的 Windows 控制台相比,Windows Terminal 完全支持现代 VT/ANSI 控制码。也就是说,Windows Terminal 里的 cmd.exe 和直接运行的 cmd.exe 不太一样。

Windows 的控制台也支持通过打印 ANSI 转义序列改变控制台的前景色、背景色等属性。比如对于“山上有一头牛在吃草”。我们可以打印“山上有\x1b[31m一头牛\x1b[39m在吃草”。这会让“一头牛”变成红色。“\x1b[31m”表示把前景色改为红色,而“\x1b[39m”表示改回默认前景色。这个特性无论是 Windows Terminal 还是 cmd.exe 都支持。

但如果你之前调整过控制台的前景色,比如改成了绿色,那么打印“山上有\x1b[31m一头牛\x1b[39m在吃草”之后,前景色不会被恢复为绿色,而是会恢复到你修改之前的系统默认的前景色。

要解决这个问题,一个可行的办法是在用“\x1b[31m”把前景色改为红色之后,不是用“\x1b[39m”恢复默认前景色,而是用“\x1b[32m”把前景色设置为绿色。

但程序怎么知道前景色是什么?用系统 API 肯定可以做到,但有没有跨平台的方法?比如用 ANSI 转义序列能不能实现?可以,只要向控制台打印“\x1b]10;?\x07”,就会得到前景色的 RGB 数据。

“\x1b]10;?\x07”这个查询前景色的 ANSI 转义序列只有 Windows Terminal 支持,cmd.exe 是不支持的。

发布于 北京