在我正在撰寫的程式中,我希望在出現錯誤時整個控制臺背景變為藍色。在 Python 或 C 中,這很容易通過os.system("color 17"). 我怎樣才能在 C# 中做到這一點?
我一直在嘗試的代碼似乎在另一個視窗中執行命令,并且對主視窗沒有影響。
public static int system(String command)
{
Process cmd = new Process();
cmd.StartInfo.FileName = "cmd.exe";
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.CreateNoWindow = false;
cmd.StartInfo.UseShellExecute = false;
cmd.Start();
cmd.StandardInput.WriteLine(command);
cmd.StandardInput.Flush();
cmd.StandardInput.Close();
cmd.WaitForExit();
Console.WriteLine(cmd.StandardOutput.ReadToEnd());
return cmd.ExitCode;
}
然后用system("color 17")
我曾嘗試翻轉一些 cmd.StartInfo 引數,但這似乎會使程式崩潰。
如果有幫助的話,我正在使用 Visual Studio 2022 在 Windows 11 上使用 Microsoft .NET 6.0
uj5u.com熱心網友回復:
不要使用外部應用程式,這不是 80 年代。特別是對于像控制臺緩沖區操作這樣微不足道的事情。
.Net 實際上帶有Console.BackgroundColor并Console.ForegroundColor內置設定新字符的字符屬性,因此缺少的只是將緩沖區中的現有字符更改為所需的屬性(這就是這樣color做的)。其功能是FillConsoleOutputAttribute。
所以把它放在一起,實作你想要的代碼很簡單:
public static void Main()
{
var stdout = GetStdHandle(-11);
FillConsoleOutputAttribute(stdout,
CharAttributes.BACKGROUND_BLUE | CharAttributes.FOREGROUND_BLUE | CharAttributes.FOREGROUND_RED | CharAttributes.FOREGROUND_GREEN,
(uint)(Console.BufferWidth * Console.BufferHeight), new(), out var _);
Console.BackgroundColor = ConsoleColor.DarkBlue;
Console.ForegroundColor = ConsoleColor.Gray;
}
有幾個 P/Invoke 定義:
[StructLayout(LayoutKind.Sequential)]
public struct COORD
{
public short X;
public short Y;
}
enum CharAttributes : ushort
{
None = 0x0000,
FOREGROUND_BLUE = 0x0001,
FOREGROUND_GREEN = 0x0002,
FOREGROUND_RED = 0x0004,
FOREGROUND_INTENSITY = 0x0008,
BACKGROUND_BLUE = 0x0010,
BACKGROUND_GREEN = 0x0020,
BACKGROUND_RED = 0x0040,
BACKGROUND_INTENSITY = 0x0080,
COMMON_LVB_LEADING_BYTE = 0x0100,
COMMON_LVB_TRAILING_BYTE = 0x0200,
COMMON_LVB_GRID_HORIZONTAL = 0x0400,
COMMON_LVB_GRID_LVERTICAL = 0x0800,
COMMON_LVB_GRID_RVERTICAL = 0x1000,
COMMON_LVB_REVERSE_VIDEO = 0x4000,
COMMON_LVB_UNDERSCORE = 0x8000,
}
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool FillConsoleOutputAttribute(IntPtr hConsoleOutput, CharAttributes wAttribute, uint nLength, COORD dwWriteCoord, out uint lpNumberOfAttrsWritten);
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/510429.html
標籤:C#视窗安慰
上一篇:USB設備的唯一識別符號
