Windows api 控制台操作:取消最大化、最小化、关闭菜单

主要步骤:

  1. 找到窗口句柄
  2. 删除对应菜单选项

相关函数:

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:取消菜单栏
    在这里插入图片描述


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值