Aktivieren und Steuern der DWM-Komposition

Die DWM-Kompositions-APIs (Desktop Window Manager) bieten mehrere Funktionen zum Festlegen und Abfragen grundlegender Informationen, die vom DWM verwendet werden. Mit diesen APIs können Sie den Kompositionszustand abfragen und ändern. Darüber hinaus können Sie die Renderingrichtlinie für verschiedene DWM-Fensterattribute festlegen und abfragen.

Abrufen von Farbinformationen

Die Farbe des Nicht-Clientbereichs eines Fensters wird durch das aktuelle Systemfarbdesign bestimmt. Der Farbwert wird über die DWM-APIs bereitgestellt, damit Ihre Anwendung die Clientbenutzeroberfläche mit dem Systemfarbdesign abgleichen kann.

Um auf diesen Farbwert zuzugreifen und die Farbänderung zu überwachen, verwenden Sie die DwmGetColorizationColor-Funktion und die WM_DWMCOLORIZATIONCOLORCHANGED Meldung.

In diesem Beispiel wird veranschaulicht, wie Sie die Geänderte Farbe behandeln und auf die neue Farbe zugreifen.

...
case WM_DWMCOLORIZATIONCOLORCHANGED:
{
    DWORD newColorizationColor{ (DWORD)wParam };
    BOOL isBlendedWithOpacity{ (BOOL)lParam };
}
break;
...

Steuern des Renderings von Nicht-Clientregionen

Zwei der visuellen Effekte, die DWM ermöglicht, sind transparenz des Nicht-Clientbereichs eines Fensters und Übergangseffekte. Möglicherweise muss Ihre Anwendung diese Effekte aus Formatierungs- oder Kompatibilitätsgründen deaktivieren oder erneut aktivieren. Die folgenden Funktionen werden verwendet, um transparenz- und übergangswirkungsverhalten zu verwalten.

Um den aktuellen Nicht-Client-Renderingstatus für das Fenster einer Anwendung abzurufen, rufen Sie DwmGetWindowAttribute auf, wobei dwAttribute auf DWMWA_NCRENDERING_ENABLED festgelegt ist. Wie Sie in der Dokumentation für DWMWA_NCRENDERING_ENABLED sehen können, ist der abgerufene Attributwert vom Typ BOOL, wenn Sie dieses Flag an DwmGetWindowAttribute übergeben. Unterschiedliche Flags führen dazu, dass DwmGetWindowAttribute Werte unterschiedlicher Typen zurückgibt. Hier sehen Sie ein Codebeispiel.

BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_NCRENDERING_ENABLED,
    &isNCRenderingEnabled,
    sizeof(isNCRenderingEnabled));

In diesem nächsten Beispiel wird gezeigt, wie Sie das DWMWA_EXTENDED_FRAME_BOUNDS-Flag mit DwmGetWindowAttribute verwenden, um das Rechteck für erweiterte Framegrenzen eines Fensters abzurufen. In der Dokumentation für dieses Flag wird angegeben, dass der abgerufene Attributwert vom Typ RECT ist.

RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
    DWMWA_EXTENDED_FRAME_BOUNDS,
    &extendedFrameBounds,
    sizeof(extendedFrameBounds));

Hinweis

Befolgen Sie das oben gezeigte Programmiermuster, wenn Sie DwmGetWindowAttribute mit Flags für verschiedene Attribute aufrufen. Das Thema DWMWINDOWATTRIBUTE-Enumeration gibt in der Zeile für jedes Flag an, auf welchen Werttyp Sie im pvAttribute-Parameter für DwmGetWindowAttribute einen Zeiger übergeben sollten. Der cbAttribute-Parameter enthält die Größe dieses Objekts in Bytes.

Mit DwmSetWindowAttribute kann Ihre Anwendung die Nicht-Clientbereichsrenderingrichtlinie festlegen. Diese Funktion bestimmt auch, wie Ihre Anwendung DWM-Übergangseffekte behandeln soll.

In diesem nächsten Beispiel wird das Rendern von Nicht-Client-Bereichen deaktiviert. Dies führt dazu, dass alle vorherigen Aufrufe von DwmEnableBlurBehindWindow oder dwmExtendFrameIntoClientArea deaktiviert werden.

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;
}

Zusätzlich zur Steuerung des Nicht-Clientbereichsrenderings kann DwmSetWindowAttribute auch DWM-Übergangseffekte steuern. Sie können das Übergangsverhalten festlegen, indem Sie DWMWA_TRANSITIONS_FORCEDISABLED als dwAttribute-Parameter verwenden.

Nachrichten

Die folgenden Meldungen enthalten Benachrichtigungen über DWM-Ereignisse. Diese Meldungen können verwendet werden, um Änderungen wie Änderungen des Kompositionszustands und Systemfarbendesigns zu überwachen.

Deaktivieren der DWM-Komposition (Windows 7 und früher)

Warnung

Die Informationen in diesem Abschnitt gelten nur für Windows 7- und frühere Systeme.

Da DWM die Grafikverarbeitungseinheit (Graphics Processing Unit, GPU) für die Desktopkomposition verwendet, muss Ihre Anwendung DWM möglicherweise aus Kompatibilitätsgründen deaktivieren. Anwendungen, die die vollständige Kontrolle über den Desktop übernehmen, z. B. Spiele, die im Vollbildmodus ausgeführt werden, müssen bestimmen, ob die DWM aktiviert ist, und wenn dies der Grund ist, deaktivieren. Dazu sind zwei Funktionen erforderlich.

Ein Aufruf von DwmEnableComposition mit fEnable auf DWM_EC_DISABLECOMPOSITION deaktiviert die DWM-Komposition, bis entweder der aufrufende Prozess heruntergefahren oder die Komposition durch Aufrufen von DwmEnableComposition wieder aktiviert wurde, wobei fEnable auf DWM_EC_ENABLECOMPOSITION festgelegt ist. Die DWM-Komposition wird automatisch neu gestartet, sobald alle Anwendungen, die die Komposition deaktiviert haben, entweder heruntergefahren oder die Komposition manuell durch Aufrufen von DwmEnableComposition neu aktiviert wurden.

Hinweis

Die DWM deaktiviert die Komposition automatisch, wenn eine Anwendung versucht, direkt auf die primäre Anzeigeoberfläche zu zeichnen. Die Komposition wird deaktiviert, bis die primäre Geräteoberfläche von dieser Anwendung freigegeben wird.