启用和控制 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 的情况下调用 DwmGetWindowAttributeDWMWA_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 枚举主题指示在每个标志的行中,应在 DwmGetWindowAttributepvAttribute 参数中将指针传递给哪种类型的值。 cbAttribute 参数包含该对象的大小(以字节为单位)。

DwmSetWindowAttribute 使应用程序能够设置非工作区呈现策略。 该函数还确定应用程序应如何处理 DWM 转换效果。

下一个示例禁用非工作区呈现。 这会导致禁用以前对 DwmEnableBlurBehindWindowDwmExtendFrameIntoClientArea 的任何 调用。

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 事件的通知。 这些消息可用于监视更改,例如合成状态更改和系统颜色主题更改。

(Windows 7 及更早版本) 禁用 DWM 组合

警告

本部分中的信息仅适用于 Windows 7 和更早的系统。

由于 DWM 使用图形处理单元 (GPU) 进行桌面组合,因此应用程序可能必须禁用 DWM 才能实现兼容性。 完全控制桌面的应用程序(例如在全屏模式下运行的游戏)必须确定是否已启用 DWM,如果是,则禁用它。 为此,需要两个函数。

在 fEnable 设置为 DWM_EC_DISABLECOMPOSITION 的情况下调用 DwmEnableComposition 会禁用 DWM 组合,直到调用进程已关闭,或者通过将 fEnable 设置为 DWM_EC_ENABLECOMPOSITION 调用 DwmEnableComposition 来重新启用合成。 禁用组合的所有应用程序关闭或通过调用 DwmEnableComposition 手动重新启用组合后,DWM 组合会自动重启。

注意

当应用程序尝试直接绘制到主要显示图面时,DWM 会自动禁用合成。 组合将被禁用,直到该应用程序释放主设备图面。