Исключение System.IO при вызове размера буфера консоли - PullRequest
0 голосов
/ 18 ноября 2018

Я играл с созданием игрового движка в командной строке Windows, в основном для образовательных целей и посмотрим, как далеко я могу его продвинуть.Я только что наткнулся на ошибку, которую не могу понять, как ее решить.

public ConsoleEngine(int width = 32, int height = 32, int fontW = 8, int fontH = 8) {
    Console.SetWindowSize(width, height);
    Console.SetBufferSize(width, height);   < IOException: 'The parameter is incorrect'
    Console.CursorVisible = false;

    ConsoleBuffer = new ConsoleBuffer(width, height);
    KeyBuffer = new KeyBuffer();

    ConsoleFontSize.SetFontSize((short)fontW, (short)fontH);

    ...
}

Line 3 выдает System.IO.IOException с сообщением The parameter is incorrect..Я считаю, Line 9, что вызвало ошибку в первую очередь.Чтобы кратко объяснить, ConsoleFontSize.SetFontSize() предназначен для изменения размера шрифта шрифта.Мне удалось заставить его работать в целом, но когда я указал от FaceName до "Consolas", это сработало один раз, но затем начало выдавать мне эту ошибку.С тех пор я не смог заставить его работать снова, неважно, если я закомментирую Line 3 или Line 9.

public static int SetFontSize(short sizeX, short sizeY) {
    IntPtr hConsoleOutput = ConsoleHelper.GetStdHandle(-11);
    if (hConsoleOutput == new IntPtr(-1)) {
        return Marshal.GetLastWin32Error();
    }

    ConsoleHelper.CONSOLE_FONT_INFO_EX cfi = new ConsoleHelper.CONSOLE_FONT_INFO_EX();
    cfi.cbSize = (uint)Marshal.SizeOf(cfi);
    cfi.nFont = 0;
    cfi.dwFontSize.X = sizeX;
    cfi.dwFontSize.Y = sizeY;
    //cfi.FaceName = "Raster";
    //cfi.FaceName = "Consolas";

    ConsoleHelper.SetCurrentConsoleFontEx(hConsoleOutput, false, ref cfi);
    return 0;
}

SetFontSize использует ConsoleHelper, оболочку для функций "kernel32.dll":

[DllImport("kernel32.dll", SetLastError = true)]
public static extern Int32 SetCurrentConsoleFontEx(
    IntPtr ConsoleOutput,
    bool MaximumWindow,
    ref CONSOLE_FONT_INFO_EX ConsoleCurrentFontEx);

Я знаю, что ни ширина, ни переменная высоты не выходят за границы.Я пытался изменить имя лица на других (например, Raster), но безрезультатно.Я размышляю, не мог ли я испортить указатель на Console, но у меня есть немного опыта в этой области, чтобы быть уверенным.

Пожалуйста, прокомментируйте дополнительные детали исключения, не был уверен, что будетбыть необходимым.

...