各種操作系統的控制檯都支持 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 中又再次默認關閉了。
參考資料
- SetConsoleMode function - Windows Console - Microsoft Docs
- Win10 New Console: Enable ENABLE_VIRTUAL_TERMINAL_PROCESSING by default (or with a flag) · Issue #92 · rprichard/winpty
- (Re?)enable ENABLE_VIRTUAL_TERMINAL_PROCESSING by default – Welcome to the Windows developer feedback site!
- ANSI escape code - Wikipedia
- c# - adding text decorations to console output - Stack Overflow
- Windows 10 Command Prompt: New Console vs. Legacy Console - Password Recovery