调用控制台缓冲区大小

时间:2018-11-18 17:17:39

标签: c# console-application ioerror kernel32 interopservices

我一直在尝试在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 3Line 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);

我知道width或height变量都不在边界之外。我尝试将面部名称更改为其他面部名称(例如Raster),但无济于事。我正在猜测是否可以弄乱指向Console的指针,但是可以肯定的是,我在该领域的经验很少。

请评论其他异常详细信息,不确定是否必要。

0 个答案:

没有答案