我如何操纵控制台光标的位置在.net核心



我如何操纵控制台光标位置在dotnet核心?

据我所知,在https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs中没有办法操纵光标的位置。

这是否意味着这在windows上是不可能的,而在linux上通过ANSI转义序列是可能的?

ConsolePal类中,您有private static IntPtr OutputHandle(这是您想要移动光标的控制台的句柄),因此在该类中,您必须公开一个方法来设置光标位置。在这种方法中,你必须调用系统API SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);COORD是:

[StructLayout(LayoutKind.Sequential)]
internal struct COORD
{
    internal short X;
    internal short Y;
} 

您可以在Interop.mincore类中添加以前方法的DllImport(因为似乎是在这里系统DllImport被制作),所以您想要的地方可以:

internal partial class Interop
{
    internal partial class mincore
    {
        [DllImport("kernel32.dll", SetLastError=true)]
        internal static extern bool SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);
    }
}

要在ConsolePal中公开的方法可以像这样:

public static void SetCursorPosition(int left, int top)
{
    IntPtr consoleOutputHandle = OutputHandle;
    COORD cursorPosition = new COORD {
        X = (short) left,
        Y = (short) top
    };
    Interop.mincore.SetConsoleCursorPosition(consoleOutputHandle, cursorPosition;
}

注意:为方法增加了一些输入检查和Interop.mincore.SetConsoleCursorPosition返回值检查

并且在Console类中简单地公开一个调用ConsolePal.SetCursorPosition

的方法
public static void SetCursorPosition(int left, int top)
{
     ConsolePal.SetCursorPosition(left, top);
}
我没有测试上面的代码,所以它可能包含错误。

编辑

正如@Jcl所说,使用。net的自定义版本可能不受欢迎。在这种情况下,您可以编写一个简单的类来移动光标(即使此解决方案仅适用于Windows):

static class MyAwesomeConsoleExtensions
{
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr GetStdHandle(int nStdHandle);
    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);
    [StructLayout(LayoutKind.Sequential)]
    private struct COORD
    {
        internal short X;
        internal short Y;
    }
    private const int STD_OUTPUT_HANDLE = -11;
    public static void SetCursorPos(int left, int top)
    {
        IntPtr consoleOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD cursorPosition = new COORD
        {
            X = (short)left,
            Y = (short)top
        };
        SetConsoleCursorPosition(consoleOutputHandle, cursorPosition);
    }
}

最新更新