讓控制檯支持 ANSI 轉義序列,輸出下劃線、修改顏色或其他控制

各種操作系統的控制檯都支持 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 中又再次默認關閉了。


參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章