如何在不在C#中移动光标的情况下将char输出到控制台?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在不在C#中移动光标的情况下将char输出到控制台?相关的知识,希望对你有一定的参考价值。

我目前正在使用C#(.NET 4.5)来制作控制台应用程序。我遇到的问题是在使用Console.Write(char c)之后光标总是移动到下一个单元格,所以当它到达一行的最后一个单元格时,它会转到下一行,弄乱所有布局。是否可以在不移动光标的情况下向控制台输出字符(背景和前景色)?

我使用的代码如下:

Console.BackgroundColor = bgColor;
Console.ForegroundColor = fgColor;
Console.SetCursorPosition(currX, currY);
Console.Write(c);

假设currX和currY为整数,bgColor和fgColor为ConsoleColor,c为char。

谢谢。

答案

根据the documentation of the Console class的说法,它只提供对标准输出流的访问,而不是屏幕缓冲区(尽管你可以改变缓冲区的某些属性,例如它的大小)。 MoveBufferArea是另一个明显的例外,但在这里并不真正适用1。

Win32 API确实提供了对控制台缓冲区的访问。你可能想要调用WriteConsoleOutputWriteConsoleOutputCharacter。 (p / invoke声明here

值得注意的是:

WriteConsoleOutput对光标位置没有影响。

哦,你可能想要Unicode版本(以W结尾),因为.NET字符串都是UTF-16。


1它允许您以两种方式提供内容:内容已经在缓冲区中 - 但首先将其放在那里是问题,或者从提供的字符和属性 - 但这仅用于填充“源”区域,目的地不是可选的。

另一答案

试试像......

Console.Write("b");
Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
Console.Write("c");

对我来说,这只是打印b打印,然后用c替换它。实际上,前两行一起写入控制台而不移动光标。你可以得出结论,因为当你写c时,它会覆盖b而不是将它放在下一个位置。

你甚至可以编写一个辅助方法:

static void WriteWithoutMove(string s) 
{
    Console.Write(s);
    Console.SetCursorPosition(Console.CursorLeft - 1, Console.CursorTop);
}

这是你在找什么?

另一答案

我记得旧的DOS,使用OLD命令(例如)BASIC:

locate(21,50)
print "Qty[26]";

注意:(;)用于粘贴文本的光标并添加1个字符,如果使用(,)则为TAB (CHR$(8))

以上是关于如何在不在C#中移动光标的情况下将char输出到控制台?的主要内容,如果未能解决你的问题,请参考以下文章

如何在C语言中不指定数组大小的情况下将数字读入数组

如何在不导致复制的情况下将 char 数据附加到 std::vector

如何:在不使用 atof 的情况下将 char 字符串的值转换为 double back

如何在不停止的情况下将物体朝一个方向移动

在不使用经典 RPyC 的情况下将 RPyC 的标准输出重定向到本地客户端

如何在插入点后不重新索引/移动项目的情况下将数据插入到有序、随机可访问的列表中?