【问题标题】:How to output a char to the console without moving the cursor afterwards in C#?如何在 C# 之后不移动光标的情况下将字符输出到控制台?
【发布时间】:2014-04-28 20:41:11
【问题描述】:

我目前正在使用 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 为字符。

谢谢。

【问题讨论】:

  • 您需要更具体地了解如何使用SetCursorPosition,因为这显然是这里的问题。您应该能够打印并简单地将光标位置备份 1 个字符并且一切顺利。
  • 有点尴尬的是,您可以使用MoveBufferArea 函数“写入”到右下角而无需滚动页面。
  • 我使用 SetCursorPosition 写入特定单元格。问题是,如果我写到一行的第 79 位,它会转到下一行。我认为问题在于我应该使用其他不是 Console.Write 的东西,但我不知道是什么。我也检查了 MSDN,没有任何结果。
  • @500-InternalServerError,您是否建议使用 MoveBufferArea 而不是 Write 与一个单元格区域?
  • 您可以在执行 Console.Write(c) 后使用 SetCursorPosition 再次重置位置。

标签: c# .net console console-application


【解决方案1】:

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

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

值得注意的是:

WriteConsoleOutput 对光标位置没有影响。

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


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

【讨论】:

    【解决方案2】:

    尝试类似...

    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);
    }
    

    这就是你要找的吗?

    【讨论】:

    • 没那么简单。如果他在一行的末尾写了一个字符,光标将向下移动到下一行。如果他写到控制台窗口最后一行的最后一个位置,窗口就会滚动。
    • @JimMischel 这是个好主意。 OP 将需要跟踪每次写入内容时写入的最后一个位置,并在他想要不移动地写入时将位置重新设置为之前的位置。
    • 我会尝试这个解决方案和缓冲溶液。有时间我会更新的。
    • 此解决方案无法正常工作,因为当字符被写入最后一行的最后一列时,您无法阻止滚动。
    • 这是想太多了。只需保存旧光标位置,做任何你想做的事,然后恢复旧位置。无需关心缓冲区宽度等。
    【解决方案3】:

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

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

    注意: (;) 用于将光标固定在文本上并添加 1 个字符,如果使用 (,) 则为 TAB (CHR$(8))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 2019-12-13
      • 2013-01-02
      • 1970-01-01
      • 2018-12-04
      • 2021-04-07
      • 1970-01-01
      相关资源
      最近更新 更多