Dela via


Aktivera och kontrollera DWM-sammansättning

API:er för skrivbordsfönsterhanteraren (DWM) innehåller flera funktioner för att ange och fråga efter grundläggande information som används av DWM. Med dessa API:er kan du fråga efter och ändra sammansättningstillståndet. Dessutom kan du ange och fråga renderingsprincipen för olika DWM-fönsterattribut.

Hämtar färgläggningsinformation

Färgen på icke-klientregionen i ett fönster bestäms av det aktuella systemfärgtemat. Färgsättningsvärdet tillhandahålls via DWM-API:erna för att göra det möjligt för ditt program att matcha klientgränssnittet med systemets färgtema.

Om du vill komma åt det här färgvärdet och övervaka färgändringen använder du funktionen DwmGetColorizationColor och meddelandet WM_DWMCOLORIZATIONCOLORCHANGED.

Det här exemplet visar hur du hanterar det ändrade färgmeddelandet och får åtkomst till den nya färgen.

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

Kontrollera återgivning av icke-klientregion

Två av de visuella effekter som DWM aktiverar är transparens i regionen icke-klient i ett fönster och övergångseffekter. Programmet kan behöva inaktivera eller återaktivera dessa effekter av formaterings- eller kompatibilitetsskäl. Följande funktioner används för att hantera transparens och beteende för övergångseffekter.

Om du vill hämta det aktuella icke-klientåtergivningstillståndet för ett programs fönster anropar du DwmGetWindowAttribute med dwAttribute inställt på DWMWA_NCRENDERING_ENABLED. Som du kan se i dokumentationen för DWMWA_NCRENDERING_ENABLED, när du skickar flaggan till DwmGetWindowAttribute, är det hämtade attributvärdet av typen BOOL. Olika flaggor gör att DwmGetWindowAttribute returnerar värden av olika typer. Här är ett kodexempel.

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

I nästa exempel visas hur du använder flaggan DWMWA_EXTENDED_FRAME_BOUNDS med DwmGetWindowAttribute för att hämta rektangeln för utökade ramgränspunkter i ett fönster. Dokumentationen för flaggan anger att det hämtade attributvärdet är av typen RECT.

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

Not

Följ samma programmeringsmönster som visas ovan när du anropar DwmGetWindowAttribute med flaggor för olika attribut. DWMWINDOWATTRIBUTE- uppräkningsavsnittet anger i raden för varje flagga vilken typ av värde du ska skicka en pekare till i parametern pvAttribute för DwmGetWindowAttribute. Parametern cbAttribute innehåller objektets storlek i byte.

DwmSetWindowAttribute gör det möjligt för ditt program att ange principen för icke-klientområdesrendering. Den funktionen avgör också hur programmet ska hantera DWM-övergångseffekter.

I nästa exempel inaktiveras icke-klientområdesrendering. Detta gör att alla tidigare anrop till DwmEnableBlurBehindWindow eller till DwmExtendFrameIntoClientArea inaktiveras.

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

Förutom att styra icke-klientområdesrendering kan DwmSetWindowAttribute också styra DWM-övergångseffekter. Du kan ange övergångsbeteende med hjälp av DWMWA_TRANSITIONS_FORCEDISABLED som parametern dwAttribute.

Meddelanden

Följande meddelanden ger meddelande om DWM-händelser. Dessa meddelanden kan användas för att övervaka ändringar, till exempel ändringar i kompositionstillstånd och ändringar i systemfärgtemat.

Inaktivera DWM-komposition (Windows 7 och tidigare)

Varning

Informationen i det här avsnittet gäller endast för Windows 7- och tidigare system.

Eftersom DWM använder grafikprocessorn (GPU) för skrivbordssammansättning kan ditt program behöva inaktivera DWM för kompatibilitet. Program som tar full kontroll över skrivbordet, till exempel spel som körs i helskärmsläge, måste avgöra om DWM är aktiverat och om det är det, inaktivera det. För att göra detta krävs två funktioner.

Ett anrop till DwmEnableComposition med fEnable inställt på DWM_EC_DISABLECOMPOSITION inaktiverar DWM-sammansättning tills anropsprocessen har stängts av eller kompositionen har återaktiverats genom att anropa DwmEnableComposition med fEnable inställd på DWM_EC_ENABLECOMPOSITION. DWM-kompositionen startas om automatiskt så snart alla program som har inaktiverat kompositionen antingen har stängts av eller har återaktiverat sammansättning manuellt genom att anropa DwmEnableComposition.

Not

DWM inaktiverar automatiskt kompositionen när ett program försöker rita direkt till den primära visningsytan. Kompositionen inaktiveras tills den primära enhetsytan släpps av programmet.