启用和控制 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 启用的两种视觉效果是窗口的非客户端区域的透明度,以及转换效果。 出于样式设置或兼容性原因,应用程序可能必须禁用或重新启用这些效果。 以下函数用于管理透明度和转换效果行为。
若要检索应用程序的窗口的当前非客户端呈现状态,请调用 DwmGetWindowAttribute,并将 dwAttribute 设置为 DWMWA_NCRENDERING_ENABLED。 如 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 枚举主题指示,在每个标志的行中,应将指针传递给 pvAttribute 参数中的 DwmGetWindowAttribute。 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
禁用 DWM 组合(Windows 7 及更早版本)
警告
本节中的信息仅适用于 Windows 7 和更早的系统。
由于 DWM 使用图形处理单元(GPU)进行桌面合成,因此应用程序可能必须禁用 DWM 才能兼容。 完全控制桌面的应用程序(例如在全屏模式下运行的游戏)必须确定 DWM 是否已启用,如果是,请禁用它。 为此,需要两个函数。
调用 DwmEnableComposition,fEnable 设置为 DWM_EC_DISABLECOMPOSITION 禁用 DWM 组合,直到调用进程已关闭,或者通过调用 DwmEnableComposition 重新启用合成,fEnable 设置为 DWM_EC_ENABLECOMPOSITION。 当禁用组合的所有应用程序都关闭或通过调用 dwmEnableComposition 调用DwmEnableComposition 来手动重新启用合成时,DWM 组合就会自动重启。
注意
当应用程序尝试直接绘制到主显示图面时,DWM 会自动禁用合成。 组合将被禁用,直到应用程序释放主设备图面。