Aktivieren und Steuern der DWM-Komposition

Die Desktopfenster-Manager(DWM)-Kompositions-APIs 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 Farbgebungsinformationen

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

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

In diesem Beispiel wird veranschaulicht, wie die Meldung "Farbänderung" behandelt und auf die neue Farbe zugreifen kann.

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

Steuern des Renderns von nicht clientseitigen Regionen

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

Rufen Sie DwmGetWindowAttribute auf, und legen Sie dwAttribute auf DWMWA_NCRENDERING_ENABLED. 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. Verschiedene Flags bewirken, dass DwmGetWindowAttribute Werte verschiedener Typen zurück gibt. Hier sehen Sie ein Codebeispiel.

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

Im nächsten Beispiel wird gezeigt, wie das DWMWA_EXTENDED_FRAME_BOUNDS-Flag mit DwmGetWindowAttribute verwendet wird, um das erweiterte Rahmengrenzerechteck eines Fensters abzurufen. Die Dokumentation für dieses Flag teilt uns mit, 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 DwMWINDOWATTRIBUTE-Enumerationsthema 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 Richtlinie zum Rendern von Nicht-Clientbereich festlegen. Diese Funktion bestimmt auch, wie Ihre Anwendung DWM-Übergangseffekte behandeln soll.

Im nächsten Beispiel wird das Rendern von Nicht-Clientbereich deaktiviert. Dadurch werden alle vorherigen Aufrufe von DwmEnableBlurBehindWindow oder DwmExtendFrameIntoClientArea deaktiviert.

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 zum Steuern des Nicht-Clientbereichsrenderings kann DwmSetWindowAttribute auch DWM-Übergangseffekte steuern. Sie können das Übergangsverhalten festlegen, indem Sie DWMWA _ TRANSITIONS _ FORCEDISABLED als dwAttribute-Parameter verwenden.

Meldungen

Die folgenden Meldungen stellen eine Benachrichtigung über DWM-Ereignisse zur Verfügung. Diese Meldungen können verwendet werden, um Änderungen wie Änderungen am Kompositionszustand und Änderungen des Systemfarbdesigns 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 Grafikprozessor (GRAPHICS Processing Unit, GPU) für die Desktopkomposition verwendet, muss Ihre Anwendung DWM möglicherweise aus Kompatibilitäts- bzw. Kompatibilitätsproblemen deaktivieren. Anwendungen, die die vollständige Kontrolle über den Desktop haben, z. B. Spiele, die im Vollbildmodus ausgeführt werden, müssen bestimmen, ob das DWM aktiviert ist, und, falls dies der Status ist, es deaktivieren. Dazu sind zwei Funktionen erforderlich.

Ein Aufruf von DwmEnableComposition, bei dem fEnable auf DWM _ EC _ DISABLECOMPOSITION festgelegt ist, deaktiviert die DWM-Komposition, bis entweder der aufrufende Prozess heruntergefahren wurde oder die Komposition durch Aufrufen von DwmEnableComposition mit fEnable erneut aktiviert wurde, wenn 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 erneut aktiviert haben.

Hinweis

Das 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.