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

