如何修改C#控制台光标形状?解决显示后变为下划线的问题
解决方案:保留控制台自定义光标样式
问题根源:.NET 的 Console.CursorVisible 属性在设置为 true 时,会将光标尺寸重置为默认值(对应下划线样式),覆盖你之前在命令行中设置的竖线光标。
以下是两种可行的解决方法:
方法一:强制设置为竖线光标
通过 Windows API 直接控制光标样式,绕过 .NET 默认的重置逻辑。
首先定义辅助类:
using System; using System.Runtime.InteropServices; public static class ConsoleCursorHelper { [StructLayout(LayoutKind.Sequential)] private struct CONSOLE_CURSOR_INFO { public uint dwSize; public bool bVisible; } [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetConsoleCursorInfo(IntPtr hConsoleOutput, ref CONSOLE_CURSOR_INFO lpConsoleCursorInfo); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); private const int STD_OUTPUT_HANDLE = -11; public static void SetVerticalCursor() { IntPtr consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cursorInfo = new CONSOLE_CURSOR_INFO(); // 100% 尺寸对应竖线光标,下划线通常为 10% 左右 cursorInfo.dwSize = 100; cursorInfo.bVisible = true; SetConsoleCursorInfo(consoleHandle, ref cursorInfo); } }
使用时替换 Console.CursorVisible = true;:
ConsoleCursorHelper.SetVerticalCursor();
方法二:保留用户原有的光标设置
如果你需要保留用户在命令行中预先设置的光标样式(不一定是竖线),可以先保存原设置,再恢复:
更新辅助类,添加读取原光标信息的方法:
using System; using System.Runtime.InteropServices; public static class ConsoleCursorHelper { [StructLayout(LayoutKind.Sequential)] private struct CONSOLE_CURSOR_INFO { public uint dwSize; public bool bVisible; } [DllImport("kernel32.dll", SetLastError = true)] private static extern bool SetConsoleCursorInfo(IntPtr hConsoleOutput, ref CONSOLE_CURSOR_INFO lpConsoleCursorInfo); [DllImport("kernel32.dll", SetLastError = true)] private static extern bool GetConsoleCursorInfo(IntPtr hConsoleOutput, out CONSOLE_CURSOR_INFO lpConsoleCursorInfo); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); private const int STD_OUTPUT_HANDLE = -11; private static CONSOLE_CURSOR_INFO _originalCursorInfo; private static bool _isOriginalInfoSaved = false; public static void SaveOriginalCursorInfo() { if (!_isOriginalInfoSaved) { IntPtr consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); GetConsoleCursorInfo(consoleHandle, out _originalCursorInfo); _isOriginalInfoSaved = true; } } public static void RestoreOriginalCursor() { if (_isOriginalInfoSaved) { IntPtr consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(consoleHandle, ref _originalCursorInfo); } } }
使用流程:
// 程序启动时保存原光标设置 ConsoleCursorHelper.SaveOriginalCursorInfo(); // 需要显示光标时,恢复原设置(替代 Console.CursorVisible = true;) ConsoleCursorHelper.RestoreOriginalCursor();
内容的提问来源于stack exchange,提问作者Yurix
相关产品推荐
相关产品推荐

