.net ANSI颜色和直接写入控制台输出C#

ruoxqz4g  于 2023-04-13  发布在  .NET
关注(0)|答案(2)|浏览(176)

如何在使用WriteConsoleOutput和WriteConsoleOutputAttribute时在控制台中使用更多颜色?
我发现你可以用Console.write写ANSI颜色,但是我怎么用这两个方法呢?

velaa5lx

velaa5lx1#

在C#中,它的工作原理与C类似。几分钟前我在C#中使用了它,它工作得很好。下面是Color表:https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
C#示例:

Console.Write("\x1B[38;5;{0}m", runtime.Register[2]);

C示例:

printf ( "\x1B[38;5;%dm", color );
kpbwa7wx

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);
}

相关问题