You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 02:50:27