使用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
相关产品推荐
相关产品推荐

