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

时间:2017-10-21 09:51:41

标签: c# .net

我试图将控制台的大小及其缓冲区更改为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并且禁止用户调整它。

1 个答案:

答案 0 :(得分:2)

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

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

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

要避免缓冲区大小和窗口大小发生变化的顺序,并且必须在每个维度中进行处理。为了更好地理解问题,我创建了一个示例程序,它将执行您想要的操作,并允许更好地理解控制台大小更改机制 - 它不是生产代码!!!在实践中,使用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;
            }
        }
    }
}

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