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

如何移除DWM托管窗口中默认绘制的最小化/最大化/关闭按钮?

解决Windows 11下DWM自定义框架移除默认标题按钮的问题

要彻底移除DWM自动绘制的最小化/最大化/关闭按钮,同时保证窗口正常工作,可尝试以下方案:

方法1:移除系统菜单样式+调整DWM标题按钮边界

  1. 先移除窗口的WS_SYSMENU样式,阻止系统默认创建标题栏按钮:
    LONG style = GetWindowLongPtr(hWnd, GWL_STYLE);
    style &= ~WS_SYSMENU;
    SetWindowLongPtr(hWnd, GWL_STYLE, style);
    
  2. 通过DwmSetWindowAttribute设置空的标题按钮边界,强制DWM不绘制按钮:
    RECT emptyRect = {0};
    DwmSetWindowAttribute(hWnd, DWMWA_CAPTION_BUTTON_BOUNDS, &emptyRect, sizeof(RECT));
    

方法2:完全接管非客户区渲染(推荐)

如果你已经通过WM_NCHITTEST自定义非客户区交互,可直接将框架扩展到客户区,完全自主绘制:

  1. 调用DwmExtendFrameIntoClientArea把框架扩展到整个窗口:
    MARGINS margins = { -1 }; // 扩展至整个客户区
    DwmExtendFrameIntoClientArea(hWnd, &margins);
    
  2. 调整窗口样式,移除WS_CAPTION和WS_THICKFRAME(若不需要默认边框),保留WS_POPUP或WS_OVERLAPPED基础样式。
  3. 自行处理WM_PAINT绘制自定义按钮,通过WM_NCHITTEST返回对应标识(如HTMINBUTTON/HTMAXBUTTON/HTCLOSE)响应点击操作。

你之前尝试方法的问题说明

  • 直接处理WM_NCPAINT跳过DefWindowProc:DWM依赖系统默认非客户区消息处理来维护渲染和消息传递,跳过会导致窗口闪烁、WM_NCHITTEST消息丢失等问题,不推荐。
  • 设置DWMWA_NCRENDERING_POLICY为DWMNCRP_DISABLED:这会完全关闭DWM非客户区渲染,退回到经典窗口样式,因此出现Win7风格按钮和闪烁,不符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 02:42:27