启用和控制 DWM 组合
桌面窗口管理器 (DWM) 组合 API 提供了多个函数,用于设置和查询 DWM 使用的基本信息。 这些 API 使你能够查询和更改组合状态。 此外,还可以为不同的 DWM 窗口属性设置和查询呈现策略。
检索着色信息
窗口的非客户端区域的颜色由当前系统颜色主题决定。 着色值通过 DWM API 提供,使应用程序能够将客户端 UI 与系统颜色主题匹配。
若要访问此着色值并监视颜色更改,请使用 DwmGetColorizationColor 函数和 WM_DWMCOLORIZATIONCOLORCHANGED 消息。
此示例演示如何处理颜色已更改的消息并访问新颜色。
...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
DWORD newColorizationColor{ (DWORD)wParam };
BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...
控制非客户端区域呈现
DWM 启用的两个视觉效果是窗口的非客户端区域的透明度和过渡效果。 出于样式设置或兼容性原因,应用程序可能必须禁用或重新启用这些效果。 以下函数用于管理透明度和转换效果行为。
若要检索应用程序窗口的当前非客户端呈现状态,请在 dwAttribute 设置为 DWMWA_NCRENDERING_ENABLED 的情况下调用 DwmGetWindowAttribute。 从 DWMWA_NCRENDERING_ENABLED的文档可以看出,将该标志传递给 DwmGetWindowAttribute 时,检索到的属性值的类型为 BOOL。 不同的标志会导致 DwmGetWindowAttribute 返回不同类型的值。 下面是代码示例。
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
下一个示例演示如何将 DWMWA_EXTENDED_FRAME_BOUNDS 标志与 DwmGetWindowAttribute 配合使用来检索窗口的扩展框架边界矩形。 该标志的文档告诉我们检索到的属性值的类型为 RECT。
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
注意
使用不同属性的标志调用 DwmGetWindowAttribute 时,请遵循上面所示的相同编程模式。 DWMWINDOWATTRIBUTE 枚举主题指示在每个标志的行中,应在 DwmGetWindowAttribute 的 pvAttribute 参数中将指针传递给哪种类型的值。 cbAttribute 参数包含该对象的大小(以字节为单位)。
DwmSetWindowAttribute 使应用程序能够设置非工作区呈现策略。 该函数还确定应用程序应如何处理 DWM 转换效果。
下一个示例禁用非工作区呈现。 这会导致禁用以前对 DwmEnableBlurBehindWindow 或 DwmExtendFrameIntoClientArea 的任何 调用。
HRESULT DisableNCRendering(HWND hWnd)
{
HRESULT hr = S_OK;
DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED;
// Disable non-client area rendering on the window.
hr = ::DwmSetWindowAttribute(hWnd,
DWMWA_NCRENDERING_POLICY,
&ncrp,
sizeof(ncrp));
if (SUCCEEDED(hr))
{
// ...
}
return hr;
}
除了控制非工作区呈现之外, DwmSetWindowAttribute 还可以控制 DWM 转换效果。 可以通过使用 DWMWA_TRANSITIONS_FORCEDISABLED 作为 dwAttribute 参数来设置转换行为。
消息
以下消息提供 DWM 事件的通知。 这些消息可用于监视更改,例如合成状态更改和系统颜色主题更改。
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
(Windows 7 及更早版本) 禁用 DWM 组合
警告
本部分中的信息仅适用于 Windows 7 和更早的系统。
由于 DWM 使用图形处理单元 (GPU) 进行桌面组合,因此应用程序可能必须禁用 DWM 才能实现兼容性。 完全控制桌面的应用程序(例如在全屏模式下运行的游戏)必须确定是否已启用 DWM,如果是,则禁用它。 为此,需要两个函数。
在 fEnable 设置为 DWM_EC_DISABLECOMPOSITION 的情况下调用 DwmEnableComposition 会禁用 DWM 组合,直到调用进程已关闭,或者通过将 fEnable 设置为 DWM_EC_ENABLECOMPOSITION 调用 DwmEnableComposition 来重新启用合成。 禁用组合的所有应用程序关闭或通过调用 DwmEnableComposition 手动重新启用组合后,DWM 组合会自动重启。
注意
当应用程序尝试直接绘制到主要显示图面时,DWM 会自动禁用合成。 组合将被禁用,直到该应用程序释放主设备图面。