Freigeben über


Aktivieren und Steuern der DWM-Komposition

Die DwM-Kompositions-APIs (Desktop Window Manager) stellen verschiedene Funktionen zum Festlegen und Abfragen grundlegender Informationen bereit, 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 Farbisierungswert wird über die DWM-APIs bereitgestellt, damit Ihre Anwendung clientbenutzeroberfläche mit dem Systemfarbdesign abgleichen kann.

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

In diesem Beispiel wird veranschaulicht, wie die Farbe geänderte Nachricht behandelt und auf die neue Farbe zugegriffen wird.

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

Steuern des Renderns von Nicht-Client-Regionen

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

Rufen Sie DwmGetWindowAttribute auf, um den aktuellen Nicht-Client-Renderingstatus für das Fenster einer Anwendung abzurufen, wobei dwAttribute- auf DWMWA_NCRENDERING_ENABLEDfestgelegt ist. Wie Sie in der Dokumentation für DWMWA_NCRENDERING_ENABLEDsehen können, ist der abgerufene Attributwert vom Typ BOOL, wenn Sie dieses Flag an DwmGetWindowAttributeübergeben. Unterschiedliche Flags führen DwmGetWindowAttribute dazu, Werte verschiedener Typen zurückzugeben. Hier ist 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 des erweiterten Rahmens eines Fensters abzurufen. Die Dokumentation für dieses Flag teilt uns mit, dass der abgerufene Attributwert vom Typ RECTist.

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

Anmerkung

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

DwmSetWindowAttribute- ermöglicht es Ihrer Anwendung, die Renderingrichtlinie für nicht-clientseitige Bereiche festzulegen. Diese Funktion bestimmt auch, wie Ihre Anwendung DWM-Übergangseffekte behandeln soll.

Im nächsten Beispiel wird das Rendern von Nicht-Client-Bereichen 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;
}

Neben der Steuerung des Renderns von Nicht-Clientbereichen können DwmSetWindowAttribute- auch DWM-Übergangseffekte steuern. Sie können das Übergangsverhalten festlegen, indem Sie DWMWA_TRANSITIONS_FORCEDISABLED als dwAttribute Parameter verwenden.

Meldungen

Die folgenden Meldungen enthalten Benachrichtigungen über DWM-Ereignisse. Diese Meldungen können verwendet werden, um Änderungen wie Änderungen des Kompositionszustands 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 Grafikverarbeitungseinheit (GPU) für die Desktopkomposition verwendet, muss Ihre Anwendung DWM möglicherweise aus Kompatibilitätsgründen deaktivieren. Anwendungen, die die volle Kontrolle über den Desktop haben, z. B. Spiele, die im Vollbildmodus ausgeführt werden, müssen bestimmen, ob das DWM aktiviert ist und ob dies der Name ist. Dazu sind zwei Funktionen erforderlich.

Ein Aufruf von DwmEnableComposition mit fEnable auf DWM_EC_DISABLECOMPOSITION deaktiviert die DWM-Komposition, bis der Aufrufvorgang beendet wurde, oder die Komposition durch Aufrufen DwmEnableComposition mit fEnable auf DWM_EC_ENABLECOMPOSITIONfestgelegt wurde. DWM-Komposition wird automatisch neu gestartet, sobald alle Anwendungen, die die Komposition deaktiviert haben, entweder heruntergefahren oder die Komposition manuell erneut aktiviert haben, indem DwmEnableCompositionaufgerufen wird.

Anmerkung

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.