【发布时间】:2019-05-26 11:36:42
【问题描述】:
我正在编写一个应用程序,并且想要打印带下划线的文本。我做错了什么?
我使用的是来自 C# 的“翻译”代码,通常它在 C# 中效果很好,但在 C++ 中却不行。修复错误后,代码根本不起作用。它显示了一些通常不会显示的字符。这就是它打印的内容 (https://i.imgur.com/V1X2uWk.png)
这是我使用的代码
auto DllHandler = GetStdHandle(-11);
unsigned int Mode;
GetConsoleMode(DllHandler,PDWORD(Mode));
Mode |= 4;
SetConsoleMode(DllHandler,DWORD(Mode));
cout << "\x1b[5mUnderlined \x1b[0mtext" << endl;
这是原始 (C#) 代码:
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
public static extern IntPtr GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
public static extern IntPtr SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
var DllHandler = Kernel32.GetStdHandle(-11);
uint Mode;
GetConsoleMode(DllHandler,out Mode);
Mode |= 4;
SetConsoleMode(DllHandler, Mode);
Console.Write("\x1b[5mUnderlined \x1b[0mText");
提前致谢。
【问题讨论】:
-
这主要取决于您的终端字体设置以及如何控制这些设置。
-
Windows 控制台真的支持 ANSI 转义序列吗?它在 C# 中工作似乎很奇怪。我想
Console对象可能会将这些解释为执行实际的 API 调用以更改控制台模式。 -
使用
\x1b[4m代替\x1b[5m。 stackoverflow.com/questions/5237666/… -
@Ruslan - 是的,真的支持。不要检查哪个版本,但支持ENABLE_VIRTUAL_TERMINAL_PROCESSING - 寻找Console Virtual Terminal Sequences
-
用于文本格式使用 ESC [
m 代码和 4 Underline 添加下划线 - 所以需要使用\x1b[4m