如何在dotnet core中操作控制台光标位置?
就我所见,在https://github.com/dotnet/corefx/blob/master/src/System.Console/src/System/Console.cs中似乎没有办法操纵光标位置。
这是否意味着在Windows上不可能,而在Linux上可以通过ANSI转义序列实现?
如何在dotnet core中操作控制台光标位置?
就我所见,在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);
}
}
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);
}
}
DllImport
在.NET Core中被广泛使用。我建议将此调用添加到ConsolePal.Windows.cs中,以便针对特定平台进行操作,我认为这不会带来麻烦。 - Matteo UmiliDllImport
...但这确实是一个解决方案(适用于 Windows)。 - Jcl