SetConsoleWindowInfo 函数调用始终返回false问题排查求助
SetConsoleWindowInfo调用返回FALSE的解决思路
SetConsoleWindowInfo调用失败的常见原因和修复方案如下:
- SMALL_RECT参数赋值错误
你代码中传入的
Sc_Range属于SMALL_RECT类型,该结构体的Right和Bottom是包含边界的坐标值,而非直接的宽高。如果直接赋值Sc_Range.Right = Sc_Width、Sc_Range.Bottom = Sc_Height,实际请求的尺寸会比预期大1个单位,超出合法范围导致调用失败。正确的赋值逻辑为:Sc_Range.Left = 0; Sc_Range.Top = 0; Sc_Range.Right = Sc_Width - 1; Sc_Range.Bottom = Sc_Height - 1; - 调用顺序错误
控制台窗口的尺寸不能超过当前屏幕缓冲区的尺寸,你当前的代码没有提前设置缓冲区大小,直接调整窗口尺寸,当预期窗口尺寸大于默认缓冲区大小时就会报错。需要先调用
SetConsoleScreenBufferSize设置匹配的缓冲区大小,再调用SetConsoleWindowInfo调整窗口。 - 参数超出系统限制
你设置的
Sc_Width、Sc_Height不能超过当前系统控制台支持的最大窗口尺寸,你可以调用GetLargestConsoleWindowSize接口获取当前设备支持的最大宽高做校验。 - 增加错误码排查逻辑
调用失败后可以立即调用
GetLastError()获取具体错误码:错误码87表示参数非法,错误码122表示缓冲区尺寸不足,错误码5表示权限不足,可根据错误码快速定位问题。
以下是修正后的参考代码:
Sc_Buffer = new CHAR_INFO[Sc_Width * Sc_Height]; _ConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE); if (_ConsoleOut == INVALID_HANDLE_VALUE) { MessageBox(NULL, TEXT("Invalid Output Handle."), TEXT("Error"), MB_OK); return FALSE; } // 先设置屏幕缓冲区尺寸 COORD bufferSize = { (SHORT)Sc_Width, (SHORT)Sc_Height }; if (!SetConsoleScreenBufferSize(_ConsoleOut, bufferSize)) { DWORD err = GetLastError(); // 可打印err排查问题 MessageBox(NULL, TEXT("Unable to set screen buffer size."), TEXT("Error"), MB_OK); return FALSE; } // 正确赋值窗口范围 SMALL_RECT Sc_Range = { 0, 0, (SHORT)(Sc_Width - 1), (SHORT)(Sc_Height - 1) }; if (!SetConsoleWindowInfo(_ConsoleOut, TRUE, &Sc_Range)) { DWORD err = GetLastError(); MessageBox(NULL, TEXT("Unable to set screen resolution."), TEXT("Error"), MB_OK); return FALSE; } if (!SetConsoleActiveScreenBuffer(_ConsoleOut)) { MessageBox(NULL, TEXT("Unable to Initialize screen buffer."), TEXT("Error"), MB_OK); return FALSE; }
内容的提问来源于stack exchange,提问作者Mahith Samaraweera
相关产品推荐
相关产品推荐

