我正在编写一个库,旨在使控制台程序中设置颜色、模式等变得更加容易。但是我遇到了Windows终端的问题。例如,我有一个函数:
void WindowsCLI::setUnderlinedFont()
{
auto consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
config.underlined = true;
SetConsoleTextAttribute(consoleHandle, getTextAttribute(config));
}
它使用windows.h
中的COMMON_LVB_UNDERSCORE
属性来使文本带下划线。在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 终端都启用了 "ENABLE_PROCESSED_OUTPUT" 和 "ENABLE_VIRTUAL_TERMINAL_PROCESSING"。现在,我没有其他想法如何在运行时区分这些终端。你有任何想法吗?
附注: 我已将 "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();
}
}
但是它仍然不能按照我的需求工作。
GetStdHandle(STD_OUTPUT_HANDLE)
(我不太了解Windows控制台,可能没有任何区别) - Alan BirtlesGetStdHandle(STD_OUTPUT_HANDLE)
。你当前正在为STD_INPUT_HANDLE
调用它,这是没有意义的。 - zett42