如何在使用WriteConsoleOutput和WriteConsoleOutputAttribute时在控制台中使用更多颜色?我发现你可以用Console.write写ANSI颜色,但是我怎么用这两个方法呢?
velaa5lx1#
在C#中,它的工作原理与C类似。几分钟前我在C#中使用了它,它工作得很好。下面是Color表:https://en.wikipedia.org/wiki/ANSI_escape_code#8-bitC#示例:
Console.Write("\x1B[38;5;{0}m", runtime.Register[2]);
C示例:
printf ( "\x1B[38;5;%dm", color );
kpbwa7wx2#
你必须在Windows上选择使用ANSI颜色代码。默认情况下它是不启用的。
using System.Runtime.InteropServices; public static class ConsoleColor { private const int STD_OUTPUT_HANDLE = -11; private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); public static void Initialize() { if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { EnableAnsiEscapeSequencesOnWindows(); } } private static void EnableAnsiEscapeSequencesOnWindows() { IntPtr handle = GetStdHandle(STD_OUTPUT_HANDLE); if (handle == IntPtr.Zero) { throw new Exception("Cannot get standard output handle"); } if (!GetConsoleMode(handle, out uint mode)) { throw new Exception("Cannot get console mode"); } mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; if (!SetConsoleMode(handle, mode)) { throw new Exception("Cannot set console mode"); } } }
我们只是初始化stdout并不重要,一旦虚拟终端处理被启用,它就可以在stderr上工作。
static int Main(string[] args) { ConsoleColor.Initialize(); const string AnsiError = "\x1b[38;5;161m"; const string AnsiReset = "\x1b[0m"; Console.Error.WriteLine(AnsiError + "One or more tests failed!" + AnsiReset); }
2条答案
按热度按时间velaa5lx1#
在C#中,它的工作原理与C类似。几分钟前我在C#中使用了它,它工作得很好。下面是Color表:https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
C#示例:
C示例:
kpbwa7wx2#
你必须在Windows上选择使用ANSI颜色代码。默认情况下它是不启用的。
我们只是初始化stdout并不重要,一旦虚拟终端处理被启用,它就可以在stderr上工作。