You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Windows API的SetConsoleWindowInfo设置控制台窗口大小无效求助

解决控制台俄罗斯方块窗口大小设置问题

你用SetConsoleWindowInfo没效果的核心原因是:这个函数不是用来调整控制台窗口的整体大小,它的作用是控制窗口显示屏幕缓冲区的哪一块区域。要真正修改窗口尺寸,得先调整屏幕缓冲区的大小,再设置窗口的可见范围,具体步骤如下:

正确实现步骤

  • 先设置屏幕缓冲区大小:控制台窗口的可见区域不能超过屏幕缓冲区的尺寸,必须先确保缓冲区足够大,用SetConsoleScreenBufferSize函数完成设置。
  • 再设置窗口可见区域:用SetConsoleWindowInfo指定窗口在缓冲区里的显示范围,注意坐标从0开始,右下角的坐标应为宽度-1和高度-1(比如80列的话,x最大值是79)。
  • 可选:强制调整窗口像素大小:如果需要精确控制窗口的像素尺寸,可以结合GetConsoleWindow获取窗口句柄,再用SetWindowPos直接调整。

修正后的代码

#include <iostream>
#include <Windows.h>

int nScreenWidth = 80;
int nScreenHeight = 30;

int main() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    HWND hWnd = GetConsoleWindow(); // 获取控制台窗口句柄

    // 1. 设置屏幕缓冲区大小,必须大于等于窗口要显示的尺寸
    COORD bufferSize = { (SHORT)nScreenWidth, (SHORT)nScreenHeight };
    SetConsoleScreenBufferSize(hConsole, bufferSize);

    // 2. 设置窗口可见区域:左上角(0,0),右下角(nScreenWidth-1, nScreenHeight-1)
    SMALL_RECT windowRect = { 0, 0, (SHORT)(nScreenWidth - 1), (SHORT)(nScreenHeight - 1) };
    SetConsoleWindowInfo(hConsole, TRUE, &windowRect);

    // 可选:如果需要固定窗口像素大小,比如设置为800x600
    SetWindowPos(hWnd, NULL, 0, 0, 800, 600, SWP_NOMOVE);

    while (true) {
        // 游戏逻辑
    }

    return 0;
}

关键细节说明

  • 你原来的代码直接把windowSize的右下角设为80和30,但缓冲区默认尺寸可能更小,导致SetConsoleWindowInfo调用失败(可以用GetLastError()查看错误码)。
  • 命令提示符的启动设置是默认初始状态,程序里的设置需要覆盖它,必须先调整缓冲区再设置窗口。
  • 如果遇到窗口无法缩小到指定尺寸,可能是系统限制了控制台窗口的最小尺寸(取决于当前字体的字符大小),可以尝试修改控制台字体(用SetCurrentConsoleFontEx)配合调整。

内容的提问来源于stack exchange,提问作者sarir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 03:07:45