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

Windows11下C++程序如何禁用控制台窗口的最大化、拖拽调整及关闭按钮?

解决Windows 11下控制台窗口禁用最大化、拖拽调整及关闭按钮的问题

你的代码在Windows 10能正常工作,但Windows 11里失效,核心原因是Win11对控制台窗口的架构做了调整——单纯修改系统菜单已经不够,必须同时调整窗口样式才能彻底禁用拖拽和最大化功能,再加上窗口初始化时机的影响,导致原代码效果失效。

修正后的完整代码

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

int main()
{
    // 获取控制台窗口句柄,确保窗口已完成初始化
    HWND hConsole = GetConsoleWindow();
    if (!hConsole)
    {
        MessageBox(NULL, L"无法获取控制台窗口句柄", L"错误", MB_ICONERROR);
        return 1;
    }

    // 修改窗口样式:移除最大化按钮、可拖拽调整的边框
    LONG_PTR currentStyle = GetWindowLongPtr(hConsole, GWL_STYLE);
    // 清除WS_MAXIMIZEBOX(最大化按钮)和WS_THICKFRAME(拖拽调整边框)标记
    LONG_PTR newStyle = currentStyle & ~(WS_MAXIMIZEBOX | WS_THICKFRAME);
    SetWindowLongPtr(hConsole, GWL_STYLE, newStyle);

    // 强制窗口刷新边框,让样式修改立即生效
    SetWindowPos(hConsole, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED);

    // 获取系统菜单并禁用关闭按钮
    HMENU hSysMenu = GetSystemMenu(hConsole, FALSE);
    if (hSysMenu)
    {
        // 禁用关闭选项并置灰
        EnableMenuItem(hSysMenu, SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);
        // 刷新菜单栏
        DrawMenuBar(hConsole);
    }

    // 保持程序运行以测试效果
    std::cout << "控制台窗口已禁用最大化、拖拽调整和关闭按钮" << std::endl;
    system("pause");
    return 0;
}

关键修改点说明

  • 修改窗口样式:WS_MAXIMIZEBOX控制最大化按钮的显示,WS_THICKFRAME控制窗口是否支持拖拽调整大小,移除这两个样式是Win11下禁用对应功能的核心操作,比单纯修改系统菜单更彻底。
  • 窗口刷新:调用SetWindowPos并传入SWP_FRAMECHANGED参数,强制系统重新绘制窗口边框,确保样式修改立即生效。
  • 菜单处理时机:在窗口样式修改完成后再处理系统菜单,避免Win11的窗口初始化逻辑重置菜单设置。

如果遇到关闭按钮偶尔恢复可用的极端情况,可以通过子类化窗口拦截WM_INITMENUPOPUP消息,每次弹出系统菜单时重新禁用SC_CLOSE选项,不过绝大多数场景下上面的代码已经足够解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:05:05