我正在撰寫一個庫,這將使在控制臺程式中更容易設定顏色、模式等。但是我遇到了 Windows Terminal 的問題。例如我有一個功能:
void WindowsCLI::setUnderlinedFont()
{
auto consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
config.underlined = true;
SetConsoleTextAttribute(consoleHandle, getTextAttribute(config));
}
它使用COMMON_LVB_UNDERSCORE屬性 fromwindows.h使文本帶下劃線。這個函式在 powershell 中的結果是這樣的:
,在 Windows 終端中是這樣的:
,所以顯然在第二種情況下我的函式不能正常作業。我認為問題在于 Windows 終端以虛擬終端模式運行。所以我為虛擬終端做了另一個功能:
void WindowsVirtualCLI::setUnderlinedFont()
{
printf("\x1b[4m");
}
現在它不適用于 Powershell:
,并且適用于 Windows Terminal:
。但現在我有另一個問題。如何區分程式是在 Powershell 還是 Windows Terminal 中運行。我嘗試使用此功能:
CLI& cli()
{
DWORD consoleMode;
auto consoleHandle = GetStdHandle(STD_INPUT_HANDLE);
GetConsoleMode(consoleHandle, &consoleMode);
if ((consoleMode & ENABLE_PROCESSED_OUTPUT) && (consoleMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING))
{
return windows::WindowsVirtualCLI::getInstance();
}
else
{
return windows::WindowsCLI::getInstance();
}
}
但事實證明,Powershell 和 Windows Terminal 都已ENABLE_PROCESSED_OUTPUT啟用ENABLE_VIRTUAL_TERMINAL_PROCESSING。現在,我不知道如何在運行時區分這些終端。你知道怎么做嗎?
PS我已將cli()方法更改為:
CLI& cli()
{
DWORD consoleMode;
auto consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleMode(consoleHandle, &consoleMode);
SetConsoleMode(consoleHandle, consoleMode);
if ((consoleMode & ENABLE_PROCESSED_OUTPUT) && (consoleMode & ENABLE_VIRTUAL_TERMINAL_PROCESSING))
{
return windows::WindowsVirtualCLI::getInstance();
}
else
{
return windows::WindowsCLI::getInstance();
}
}
它仍然不能按我的需要作業。
uj5u.com熱心網友回復:
檢測您是否在 Windows 終端中運行的一種簡單方法是檢查WT_SESSION環境變數是否已定義(具有值)。
根據這個答案,如果已定義,getenv("WT_SESSION")應該可以檢索該變數的值。
筆記:
這不是萬無一失的,因為如果您從 Windows Terminal 中運行的 shell
conhost.exe啟動常規控制臺視窗 ( ) ,它可能會繼承該變數。WT_SESSION更麻煩的替代方法是遍歷父行程(鏈)以查找名為
WindowsTerminal.
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489308.html
上一篇:在C中實作執行緒
