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

求适用于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:35:05