主要步骤:
- 找到窗口句柄
- 删除对应菜单选项
相关函数:
GetConsoleWindow是检索与调用进程相关联的控制台窗口句柄的意思
窗口菜单指“最大化”、“最小化”、“关闭”等按钮
参数:hWnd:拥有窗口菜单拷贝的窗口的句柄。
bRevert:标志位,指定将执行的操作。返回值:
如果参数bRevert为FALSE,返回值是窗口菜单的拷贝的句柄
如果参数bRevert为TRUE,返回值是NULL
参数:
hMenu:将被修改的菜单的句柄。
UPosition:指定将被删除的菜单项,其含义由参数uFlags决定。
uFlags:指定参数uPosition如何解释。此参数必须为下列之一值:返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
注:DeleteMenu跟RemoveMenu得区别,前者是彻底的删除,后者只是移除,不会销毁菜单或它的句柄
说明
为指定的窗口重画菜单。使用api函数改变一个窗口菜单的内容后,需要用到这个函数
返回值
Long,非零-成功,零-失败。会设置GetLastError
示例一:禁用最大化按钮
#include<Windows.h>
int main() {
HWND hwnd = GetConsoleWindow(); // 获得控制台句柄
HMENU hmenu = GetSystemMenu(hwnd, false); // 复制或修改而访问窗口菜单
RemoveMenu(hmenu, SC_MAXIMIZE, MF_BYCOMMAND); // 从指定菜单删除一个菜单项或分离一个子菜单
DrawMenuBar(hwnd);
return 0;
}
运行结果:虽然右上角的最大化按钮还在,但是点击后无效果。而左上角的弹出菜单中也没有最大化的选项。
可以看到用 GetSystemMenu 移除菜单按钮后,按钮依然会展示出来,但实际上是被禁用了。
如果我们使用 GetSystemMenu 来禁用关闭时,关闭按钮在禁用的同时会变成灰色。
#include<Windows.h>
int main() {
HWND hwnd = GetConsoleWindow();
HMENU hmenu = GetSystemMenu(hwnd, false);
RemoveMenu(hmenu, SC_CLOSE/* 关闭菜单 */, MF_BYCOMMAND);
DrawMenuBar(hwnd);
return 0;
}
注:这里可以使用 alt+F4 关闭当前窗口
RemoveMenu可支持的其他菜单选项:
/*
* System Menu Command Values
*/
#define SC_SIZE 0xF000
#define SC_MOVE 0xF010
#define SC_MINIMIZE 0xF020
#define SC_MAXIMIZE 0xF030
#define SC_NEXTWINDOW 0xF040
#define SC_PREVWINDOW 0xF050
#define SC_CLOSE 0xF060
#define SC_VSCROLL 0xF070
#define SC_HSCROLL 0xF080
#define SC_MOUSEMENU 0xF090
#define SC_KEYMENU 0xF100
#define SC_ARRANGE 0xF110
#define SC_RESTORE 0xF120
#define SC_TASKLIST 0xF130
#define SC_SCREENSAVE 0xF140
#define SC_HOTKEY 0xF150
示例二:使用 SetWindowLong 禁用最大化按钮
SetWindowLong 函数可以用来改变指定窗口的属性,而有一个属性为GWL_STYLE用于设定窗口风格。
关于SetWindowLong https://baike.baidu.com/item/SetWindowLong
#include<Windows.h>
int main() {
HWND hwnd = GetConsoleWindow();
LONG style = GetWindowLong(hwnd, GWL_STYLE); // GWL_STYLE -16 设定一个新的窗口风格。
style &= ~(WS_MAXIMIZEBOX); // 取消最大化按钮显示
SetWindowLong(hwnd, GWL_STYLE, style); // 设置窗口属性
return 0;
}
运行效果:最大化按钮变为灰色,且点击无效。
除此之外,窗口风格这里还支持其他属性:
/*
* Window Styles
*/
#define WS_OVERLAPPED 0x00000000L
#define WS_POPUP 0x80000000L
#define WS_CHILD 0x40000000L
#define WS_MINIMIZE 0x20000000L
#define WS_VISIBLE 0x10000000L
#define WS_DISABLED 0x08000000L
#define WS_CLIPSIBLINGS 0x04000000L
#define WS_CLIPCHILDREN 0x02000000L
#define WS_MAXIMIZE 0x01000000L
#define WS_CAPTION 0x00C00000L /* WS_BORDER | WS_DLGFRAME */
#define WS_BORDER 0x00800000L
#define WS_DLGFRAME 0x00400000L
#define WS_VSCROLL 0x00200000L
#define WS_HSCROLL 0x00100000L
#define WS_SYSMENU 0x00080000L
#define WS_THICKFRAME 0x00040000L
#define WS_GROUP 0x00020000L
#define WS_TABSTOP 0x00010000L
#define WS_MINIMIZEBOX 0x00020000L
#define WS_MAXIMIZEBOX 0x00010000L
#define WS_TILED WS_OVERLAPPED
#define WS_ICONIC WS_MINIMIZE
#define WS_SIZEBOX WS_THICKFRAME
#define WS_TILEDWINDOW WS_OVERLAPPEDWINDOW
-
WS_SIZEBOX:不能调整大小(最大化依然生效)
-
WS_CAPTION:取消菜单按钮
-
WS_TILEDWINDOW:取消菜单栏