Partager via


Activer et contrôler la composition DWM

Les API de composition du Gestionnaire de fenêtres de bureau (DWM) fournissent plusieurs fonctions permettant de définir et d’interroger des informations de base utilisées par le DWM. Ces API vous permettent d’interroger et de modifier l’état de composition. En outre, vous pouvez définir et interroger la stratégie de rendu pour différents attributs de fenêtre DWM.

Récupération des informations de colorisation

La couleur de la région non cliente d’une fenêtre est déterminée par le thème de couleur système actuel. La valeur de colorisation est fournie via les API DWM pour permettre à votre application de correspondre à l’interface utilisateur du client avec le thème de couleur système.

Pour accéder à cette valeur de colorisation et surveiller la modification de couleur, utilisez la fonction DwmGetColorizationColorizationColor et le message WM_DWMCOLORIZATIONCOLORCHANGED.

Cet exemple montre comment gérer le message modifié de couleur et accéder à la nouvelle couleur.

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

Contrôle du rendu de région non cliente

Deux des effets visuels activés par DWM sont la transparence de la région non cliente d’une fenêtre et les effets de transition. Votre application peut avoir à désactiver ou réactiver ces effets pour des raisons de style ou de compatibilité. Les fonctions suivantes sont utilisées pour gérer le comportement de transparence et d’effet de transition.

  • DwmGetWindowAttribute
  • DwmSetWindowAttribute

Pour récupérer l’état de rendu non client actuel de la fenêtre d’une application, appelez DwmGetWindowAttribute avec défini sur DWMWA_NCRENDERING_ENABLED. Comme vous pouvez le voir dans la documentation de DWMWA_NCRENDERING_ENABLED, lorsque vous passez cet indicateur à DwmGetWindowAttribute, la valeur d’attribut récupérée est de type BOOL. Différents indicateurs entraînent DwmGetWindowAttribute retourner des valeurs de différents types. Voici un exemple de code.

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

Cet exemple montre comment utiliser l’indicateur de DWMWA_EXTENDED_FRAME_BOUNDS avec DwmGetWindowAttribute pour récupérer le rectangle des limites de cadre étendues d’une fenêtre. La documentation de cet indicateur nous indique que la valeur d’attribut récupérée est de type RECT.

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

Note

Suivez le même modèle de programmation ci-dessus lorsque vous appelez DwmGetWindowAttribute avec des indicateurs pour différents attributs. La rubrique d’énumération DWMWINDOWATTRIBUTE indique, dans la ligne de chaque indicateur, quel type de valeur vous devez passer un pointeur dans le paramètre pvAttribute pour DwmGetWindowAttribute. Le paramètre cbAttribute contient la taille, en octets, de cet objet.

DwmSetWindowAttribute permet à votre application de définir la stratégie de rendu de zone non cliente. Cette fonction détermine également comment votre application doit gérer les effets de transition DWM.

Cet exemple suivant désactive le rendu de la zone non cliente. Cela entraîne la désactivation des appels précédents à DwmEnableBlurBehindWindow ou à 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;
}

En plus de contrôler le rendu de la zone non cliente, DwmSetWindowAttribute pouvez également contrôler les effets de transition DWM. Vous pouvez définir le comportement de transition à l’aide de DWMWA_TRANSITIONS_FORCEDISABLED comme paramètre dwAttribute.

Messages

Les messages suivants fournissent une notification d’événements DWM. Ces messages peuvent être utilisés pour surveiller les modifications telles que les modifications d’état de composition et les modifications de thème de couleur système.

Désactivation de la composition DWM (Windows 7 et versions antérieures)

Avertissement

Les informations de cette section s’appliquent uniquement aux systèmes Windows 7 et antérieurs.

Étant donné que DWM utilise l’unité de traitement graphique (GPU) pour la composition de bureau, votre application peut avoir à désactiver DWM pour la compatibilité. Les applications qui contrôlent complètement le bureau, comme les jeux qui s’exécutent en mode plein écran, doivent déterminer si le DWM est activé et le cas échéant, le désactiver. Pour ce faire, deux fonctions sont nécessaires.

  • DwmIsCompositionEnabled
  • DwmEnableComposition

Un appel à DwmEnableComposition avec fEnable défini sur DWM_EC_DISABLECOMPOSITION désactive la composition DWM jusqu’à ce que le processus appelant soit arrêté, soit la composition a été réactivée en appelant DwmEnableComposition avec défini sur DWM_EC_ENABLECOMPOSITION. La composition DWM redémarre automatiquement dès que toutes les applications qui ont désactivé la composition ont arrêté ou ont réactivé manuellement la composition en appelant DwmEnableComposition.

Note

Le DWM désactive automatiquement la composition lorsqu’une application tente de dessiner directement sur l’aire d’affichage principale. La composition sera désactivée jusqu’à ce que la surface principale de l’appareil soit libérée par cette application.