如何使文本始终保持在控制台顶部?

4

我正在尝试让我的控制台应用程序自动滚动,但保持文本在顶部。文本历史必须可访问,因此Console.Clear不可行。

是否有任何方法可以检测控制台何时滚动或任何方法可以调整当前的Y位置,因为我知道当您的文本即将离开屏幕时,控制台将滚动。我希望达到相同的效果,但保持窗口顶部的最新行。任何帮助都将不胜感激,谢谢!


我不太理解你用英语描述的内容,但也许你可以使用 Console.SetCursorPosition() - user12031933
@OlivierRogier SetCursorPosition 只设置 光标 的位置,但它不会滚动内容。根据我的理解,OP 希望实现与手动滚动相同的效果,只显示顶部行。 - 41686d6564 stands w. Palestine
@AhmedAbdelhameed 那么 OP 需要获取控制台窗口的句柄并使用滚动条的 WinAPI 吗?https://dev59.com/OnM_5IYBdhLWcg3wrFIt 和 https://learn.microsoft.com/en-us/windows/console/scrolling-the-screen-buffer & https://learn.microsoft.com/en-us/windows/console/scrolling-a-screen-buffer-s-window - user12031933
@OlivierRogier 不完全是这样。Console.SetWindowPosition() 会为您完成此操作。请注意,这里的“窗口”并不是指实际的控制台窗口本身。有关更多信息,请参见下面的答案。 - 41686d6564 stands w. Palestine
1
@AhmedAbdelhameed 好的,你的结果动画看起来不错,现在我理解了 OP 的问题。 - user12031933
1个回答

6

你可以使用Console.SetWindowPosition()方法。 *

参数
left Int32
控制台窗口左上角的列位置。

top Int32
控制台窗口左上角的行位置。

这里有一个示例来演示:

static void Main(string[] args)
{
    int i = 0;
    while (true)
    {
        Console.ReadKey(false);
        Console.WriteLine($"You are currently at line #{++i}");
        Console.SetWindowPosition(0, i - 1);
    }
}

结果:

Scroll Console to Top

请注意,如果您接近 Console.BufferHeight 的值,可能会出现 ArgumentOutOfRangeException,即当新位置(顶部)大于 Console.BufferHeight - Console.WindowHeight 时,因此您可能需要考虑这一点。我建议添加一个简单的条件来处理这种情况。示例:
int newTop = i - 1;
if (newTop + Console.WindowHeight <= Console.BufferHeight)
{
    Console.SetWindowPosition(0, newTop);
}

但您可能希望以不同的方式处理此问题(例如,随着操作增加缓冲区大小,更改窗口大小等)。


* 不要被该方法的名称所误导。这里的“窗口”并不是指操作系统中实际的桌面/控制台窗口(边框等),而是指当前显示的字符缓冲区的窗口。若要移动实际的控制台窗口,您需要使用 SetWindowPos Windows API 函数。示例


1
我认为OP是在询问如何设置文本的位置,而不是控制台窗口的位置。 - Eriawan Kusumawardhono
@AhmedAbdelhameed 我知道,这就是为什么我点赞并试图澄清事情的原因。但我认为混淆主要是因为SetWindowPosition是这种方法的一个令人困惑的名称,因为它实际上并不影响桌面窗口。您可能希望从其文档中添加这一点到答案中。 - Biesi
我点赞是因为我喜欢它,唯一不好的事情是当你添加新行时旧文本会闪烁。 - Marco Salerno
@BiesiGrr 我知道这个名称可能有点令人困惑,但是这里的“window”并不是指实际的控制台窗口。我已经更新了答案以澄清这一点。 - 41686d6564 stands w. Palestine
SetWindowPosition 的缺点是其仅限于 Windows 平台。它在 Linux 上的 .NetCore 系统中尚未工作(已测试 Core3.1.1)。 - AliReza Sabouri
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接