gpt4 book ai didi

c# - 操作 .NET System.Console 窗口大小会导致 ArgumentOutOfBoundsException

转载 作者:行者123 更新时间:2023-11-30 16:42:23 25 4
gpt4 key购买 nike

我正在尝试将控制台的大小及其缓冲区更改为 80/25。这是我试过的代码:

//ConsoleUtils u = new ConsoleUtils(); <- dummy class
while (true) {
Console.SetBufferSize(Console.WindowLeft + 80, Console.WindowTop + 25);
Console.SetWindowSize(80, 25);
System.Threading.Thread.Sleep(1); //To minimize processor ussage %.
}

一切看起来都很好,但是在我尝试调整控制台大小 后,出现了一个关于 ArgumentOutOfBounds 的严重错误(取决于我缩放控制台的方式)。 如何使控制台大小永久不变?我希望它是 80x25 并且不允许用户调整它的大小。

最佳答案

您的代码有一个错误可能会或可能不会影响结果:
Console.SetBufferSize(Console.WindowLeft + 80, Console.WindowTop + 25);
根据控制台窗口左上角坐标设置缓冲区大小。

Console.WindowLeftConsole.WindowTop 属性允许获取或设置控制台窗口的左上角位置。

第二个错误是在更改大小以调整操作顺序以满足窗口大小始终小于缓冲区大小的要求之前,缺少对控制台窗口和缓冲区大小的检查。调整控制台缓冲区和控制台窗口大小的顺序取决于目标大小和原始大小之间的关系。为了更好地理解它,有必要了解控制台窗口大小和控制台缓冲区大小之间的关系。控制台窗口是一个滑动窗口,允许显示控制台缓冲区的内容。因此,如果控制台窗口的高度或宽度大于缓冲区的高度或宽度,则会抛出 ArgumentOutOfRangeException(在 .NET 中没有 ArgumentOutOfBounds 异常类型)

为了避免 Buffer 大小和 Window 大小更改的顺序确实很重要,并且必须在每个维度上都加以注意。为了更好地理解问题,我创建了示例程序,它将只做你想做的事情,并允许更好地理解控制台大小更改机制——它不是生产代码!!!。在实践中,使用 Console.SetBufferSize 和 Console.SetWindowSize 方法会简单得多。

using System;
using System.Threading;
using static System.Console;

namespace ResizeConsoleWindow
{
class Program
{

static void Main(string[] args)
{
int targetWindowWidth = 80;
int targetWindowHeight = 25;

Timer timer = new Timer(
(object state) =>
{
int originalWindowWidth = WindowWidth;
int originalWindowHeight = WindowHeight;
int originalBufferWidth = BufferWidth;
int originalBufferHeight = BufferHeight;

if (targetWindowWidth <= originalWindowWidth)
{
WindowWidth = targetWindowWidth;
BufferWidth = targetWindowWidth;
if (targetWindowHeight <= originalWindowHeight)
{
WindowHeight = targetWindowHeight;
BufferHeight = targetWindowHeight;
}
else
{
BufferHeight = targetWindowHeight;
WindowWidth = targetWindowWidth;
WindowHeight = targetWindowHeight;
}
}
else
{
BufferWidth = targetWindowWidth;
WindowWidth = targetWindowWidth;
if (targetWindowHeight <= originalWindowHeight)
{
WindowHeight = targetWindowHeight;
BufferHeight = targetWindowHeight;
}
else
{
BufferHeight = targetWindowHeight;
WindowHeight = targetWindowHeight;
}
}

WindowWidth = targetWindowWidth;
WindowHeight = targetWindowHeight;

}, state: null, dueTime: 0, period: 200);

while (true)
{
WriteLine("Press Enter to exit ... ");
ReadLine();
break;
}
}
}
}

尝试启动程序并尝试将控制台窗口大小更改为小于目标或大于目标并查看会发生什么(以便更容易观察计时器中增加的滴答持续时间)或什至在更改控制台窗口大小和时调试程序设置断点以检查更改是如何完成的。比更改顺序并检查是否抛出异常以及何时抛出异常。

关于c# - 操作 .NET System.Console 窗口大小会导致 ArgumentOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46862027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com