奇怪的控制台MoveBufferArea IOException

m0s*_*0sa 1 c# console ioexception

我正在构建一个"反向控制台"(以便写入的行将自己添加到顶部而不是底部),因为我偶然发现了Console.MoveBufferArea方法的一个非常奇怪的行为:

    static void Main()
    {
        for (var _linesWritten = 0; _linesWritten < 1000; _linesWritten++)
        {
            var _height = Math.Min(Console.BufferHeight-1, _linesWritten);
            Console.MoveBufferArea(0, 0, Console.BufferWidth, _height, 0, 1);
            Console.SetCursorPosition(0, 0);
            Console.WriteLine("Line {0} aaaaaaaaaa", _linesWritten);
            Console.ResetColor();
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我调用它固定次数时,它会抛出一个System.IO.IOException:"没有足够的存储空间来处理这个命令".我发现它取决于移动的缓冲区的数量.抛出异常之前写入的行数随着我更改Console.BufferWidth属性而更改.

截图

我正在运行Windows 7 x64 @ Corei7,6gb DDR3,所以存储不是问题....有没有人知道什么可能是错的?

Han*_*ant 5

导致异常的API函数是ReadConsoleOutput().SDK文档有一些相关的小字体:

lpBuffer:

指向目标缓冲区的指针,该缓冲区接收从控制台屏幕缓冲区读取的数据.此指针被视为CHAR_INFO结构的二维数组的原点,其大小由dwBufferSize参数指定.阵列的总大小必须小于64K.

我加粗了相关的短语.当你的程序试图滚动超过200行(201 x 80 x 4 = 64320字节,奇怪地从65536一点点偏离)时,你的程序会爆炸.它可以说是Console.MoveBufferArea()中的一个错误,它不会检查这个限制,也不会尝试解决它很容易做到的问题.您可以在connect.microsoft.com上报告错误

目前,您必须限制行数,以便缓冲区大小不超过限制.