如何操作dotnet核心中的控制台光标位置?

时间:2015-09-18 06:49:18

标签: c# .net .net-core

如何操作dotnet核心中的控制台光标位置?

据我所见https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs,无法操纵光标位置。

这是否意味着它在Windows上是不可能的,并且可以通过ANSI转义序列在linux上实现?

1 个答案:

答案 0 :(得分:3)

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

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

您可以在DllImport类中添加前一个方法的Interop.mincore(因为它似乎在这里制作了系统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);
    }
}