求适用于XP之后、2016服务器技术预览版前Windows的控制台应用真全屏函数
实现Windows XP+控制台真全屏的方案
嘿,我懂你想要的那种完全铺满整个屏幕、连任务栏和窗口边框都看不到的真全屏控制台效果——不是系统自带的那种窗口化全屏(Alt+Enter那种其实还是窗口模式,只是最大化了)。针对Windows XP到Windows Server 2012 R2这些版本,我们可以通过调用Windows原生API来实现这个需求,下面给你一个完整的实现方案:
核心思路
要实现真全屏,我们需要做这几件事:
- 获取控制台窗口的句柄,直接对窗口进行底层操作
- 精准获取当前显示器的原生分辨率,确保覆盖整个屏幕(包括任务栏区域)
- 移除控制台窗口的所有装饰元素(标题栏、边框、最大化/最小化按钮等)
- 调整控制台的缓冲区和显示区域大小,让内容适配全屏分辨率
完整实现函数(C++)
下面是可直接使用的代码,编译运行后就能实现真全屏效果:
#include <windows.h> #include <iostream> bool SetConsoleTrueFullscreen() { // 获取控制台窗口句柄 HWND consoleWindow = GetConsoleWindow(); if (consoleWindow == NULL) { return false; } // 获取当前显示器的完整信息 MONITORINFO monitorInfo; monitorInfo.cbSize = sizeof(MONITORINFO); HMONITOR hMonitor = MonitorFromWindow(consoleWindow, MONITOR_DEFAULTTOPRIMARY); if (!GetMonitorInfo(hMonitor, &monitorInfo)) { return false; } // 提取显示器的原生分辨率 RECT monitorRect = monitorInfo.rcMonitor; int screenWidth = monitorRect.right - monitorRect.left; int screenHeight = monitorRect.bottom - monitorRect.top; // 保存原始窗口样式,方便后续恢复 LONG originalStyle = GetWindowLong(consoleWindow, GWL_STYLE); // 移除窗口的所有装饰样式 LONG newStyle = originalStyle & ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU); SetWindowLong(consoleWindow, GWL_STYLE, newStyle); // 将窗口定位到整个屏幕区域,完全覆盖任务栏 SetWindowPos(consoleWindow, HWND_TOP, monitorRect.left, monitorRect.top, screenWidth, screenHeight, SWP_FRAMECHANGED); // 调整控制台缓冲区和显示窗口大小,适配全屏 HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); if (consoleHandle == INVALID_HANDLE_VALUE) { // 失败时恢复原始窗口样式,避免窗口异常 SetWindowLong(consoleWindow, GWL_STYLE, originalStyle); return false; } COORD bufferSize = { (SHORT)screenWidth, (SHORT)screenHeight }; SetConsoleScreenBufferSize(consoleHandle, bufferSize); SMALL_RECT windowRect = { 0, 0, (SHORT)(screenWidth - 1), (SHORT)(screenHeight - 1) }; SetConsoleWindowInfo(consoleHandle, TRUE, &windowRect); return true; } // 测试用主函数 int main() { std::cout << "按任意键进入真全屏..." << std::endl; std::cin.get(); bool success = SetConsoleTrueFullscreen(); if (success) { std::cout << "已进入真全屏,按任意键退出..." << std::endl; std::cin.get(); // 退出时恢复原始窗口样式和大小 HWND consoleWindow = GetConsoleWindow(); LONG originalStyle = GetWindowLong(consoleWindow, GWL_STYLE); originalStyle |= (WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU); SetWindowLong(consoleWindow, GWL_STYLE, originalStyle); SetWindowPos(consoleWindow, HWND_TOP, 0, 0, 800, 600, SWP_FRAMECHANGED); } else { std::cout << "无法进入真全屏!" << std::endl; } return 0; }
关键细节说明
GetConsoleWindow():这是操作控制台窗口的入口,只有拿到句柄才能修改窗口属性MonitorFromWindow()+GetMonitorInfo():确保我们获取的是当前显示器的真实物理分辨率,不受系统缩放设置(比如笔记本常用的125%缩放)影响,能完美覆盖整个屏幕- 修改窗口样式:移除
WS_CAPTION(标题栏)、WS_THICKFRAME(边框)等样式后,窗口就没有任何装饰元素了 - 调整控制台缓冲区:如果不调整缓冲区大小,控制台会出现滚动条,设置成和屏幕一样的大小后,内容就能铺满整个全屏区域
注意事项
- 编译时需要链接Windows的
user32.lib和kernel32.lib,在Visual Studio中会自动处理,手动编译的话记得添加链接参数 - 退出全屏时,建议恢复原来的窗口样式,避免控制台窗口一直处于无边框状态
- 部分旧版本Windows(比如XP)可能需要管理员权限才能修改窗口属性,如果运行失败可以尝试右键以管理员身份启动
内容的提问来源于stack exchange,提问作者Cain Wildtale
相关产品推荐
相关产品推荐

