如何在 dotnet core 中操作控制台光标位置?
How do I manipulate console cursor position in dotnet core?
如何在 dotnet core 中操作控制台光标位置?
据我在 https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs 中所见,无法操纵光标位置。
这是否意味着它在 windows 上是不可能的,而在 linux 上可以通过 ANSI 转义序列实现?
在 ConsolePal
class 中,您有 private static IntPtr OutputHandle
(即您要在其上移动光标的控制台句柄),因此在 class 中,您必须公开一种方法来设置光标位置。
在此方法中,您必须调用系统 API SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);
。
COORD
是:
[StructLayout(LayoutKind.Sequential)]
internal struct COORD
{
internal short X;
internal short Y;
}
你可以在Interop.mincore
class中添加上一个方法的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
class 中简单地公开一个调用 ConsolePal.SetCursorPosition
的方法
public static void SetCursorPosition(int left, int top)
{
ConsolePal.SetCursorPosition(left, top);
}
我没有测试上面的代码,所以它可能包含错误。
编辑
如@Jcl 所述,可能不欢迎使用自定义版本的 .NET。在这种情况下,您可以编写一个简单的 class 来移动光标(即使此解决方案仅适用于 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);
}
}
如何在 dotnet core 中操作控制台光标位置?
据我在 https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs 中所见,无法操纵光标位置。
这是否意味着它在 windows 上是不可能的,而在 linux 上可以通过 ANSI 转义序列实现?
在 ConsolePal
class 中,您有 private static IntPtr OutputHandle
(即您要在其上移动光标的控制台句柄),因此在 class 中,您必须公开一种方法来设置光标位置。
在此方法中,您必须调用系统 API SetConsoleCursorPosition(IntPtr hConsoleOutput, COORD cursorPosition);
。
COORD
是:
[StructLayout(LayoutKind.Sequential)]
internal struct COORD
{
internal short X;
internal short Y;
}
你可以在Interop.mincore
class中添加上一个方法的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
class 中简单地公开一个调用 ConsolePal.SetCursorPosition
public static void SetCursorPosition(int left, int top)
{
ConsolePal.SetCursorPosition(left, top);
}
我没有测试上面的代码,所以它可能包含错误。
编辑
如@Jcl 所述,可能不欢迎使用自定义版本的 .NET。在这种情况下,您可以编写一个简单的 class 来移动光标(即使此解决方案仅适用于 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);
}
}