如何去掉在DWM管理的窗口中默认绘制的最小化、最大化和关闭按钮?

编程语言 2026-07-09

有一个著名的教程:Custom Window Frame Using DWM

一切都按预期工作(Windows 11),但现在我想去掉默认绘制的最小化/最大化/关闭按钮(希望在我想要的任意地方用 WM_NCHITTEST 自己绘制)。

即使我调用 DwmDefWindowProc(),DWM仍然会绘制按钮(但不会处理点击等)。

我尝试了以下方法:

  • 处理 WM_NCPAINT。有些人说这与DWM不兼容。当我只是尝试处理它(要么 return 0;,要么干脆不调用 DefWindowProc()),窗口在调整大小时开始闪烁,与之相关的 WM_NCHITTEST 代码停止工作(我猜 WM_NCHITTEST 不再被发送)。最有意思的事实是,DWM要求必须处理 DefWindowProc() 才能正确处理 WM_NCPAINT

  • 设置“禁用”策略:

DWMNCRENDERINGPOLICY policy = DWMNCRP_DISABLED;
DwmSetWindowAttribute(hWnd, DWMWA_NCRENDERING_POLICY, &policy, sizeof(policy));

此时窗口开始闪烁,仿Windows 7风格的按钮会在一瞬间被绘制出来(!!!)

解决方案

看起来 WS_OVERLAPPEDWINDOW & ~WS_SYSMENU 就足够了。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章