如何移除DWM托管窗口中默认绘制的最小化/最大化/关闭按钮?
解决Windows 11下DWM自定义框架移除默认标题按钮的问题
要彻底移除DWM自动绘制的最小化/最大化/关闭按钮,同时保证窗口正常工作,可尝试以下方案:
方法1:移除系统菜单样式+调整DWM标题按钮边界
- 先移除窗口的
WS_SYSMENU样式,阻止系统默认创建标题栏按钮:LONG style = GetWindowLongPtr(hWnd, GWL_STYLE); style &= ~WS_SYSMENU; SetWindowLongPtr(hWnd, GWL_STYLE, style); - 通过
DwmSetWindowAttribute设置空的标题按钮边界,强制DWM不绘制按钮:RECT emptyRect = {0}; DwmSetWindowAttribute(hWnd, DWMWA_CAPTION_BUTTON_BOUNDS, &emptyRect, sizeof(RECT));
方法2:完全接管非客户区渲染(推荐)
如果你已经通过WM_NCHITTEST自定义非客户区交互,可直接将框架扩展到客户区,完全自主绘制:
- 调用
DwmExtendFrameIntoClientArea把框架扩展到整个窗口:MARGINS margins = { -1 }; // 扩展至整个客户区 DwmExtendFrameIntoClientArea(hWnd, &margins); - 调整窗口样式,移除
WS_CAPTION和WS_THICKFRAME(若不需要默认边框),保留WS_POPUP或WS_OVERLAPPED基础样式。 - 自行处理
WM_PAINT绘制自定义按钮,通过WM_NCHITTEST返回对应标识(如HTMINBUTTON/HTMAXBUTTON/HTCLOSE)响应点击操作。
你之前尝试方法的问题说明
- 直接处理
WM_NCPAINT跳过DefWindowProc:DWM依赖系统默认非客户区消息处理来维护渲染和消息传递,跳过会导致窗口闪烁、WM_NCHITTEST消息丢失等问题,不推荐。 - 设置
DWMWA_NCRENDERING_POLICY为DWMNCRP_DISABLED:这会完全关闭DWM非客户区渲染,退回到经典窗口样式,因此出现Win7风格按钮和闪烁,不符合需求。
内容的提问来源于stack exchange,提问作者Shtole
相关产品推荐
相关产品推荐

