啟用和控制 DWM 組合

桌面視窗管理員 (DWM) 組合 API 提供數個函式來設定和查詢 DWM 所使用的基本資訊。 這些 API 可讓您查詢和變更組合狀態。 此外,您可以設定及查詢不同 DWM 視窗屬性的轉譯原則。

擷取顏色標示資訊

視窗的非用戶端區域色彩是由目前的系統色彩主題所決定。 色彩標示值是透過 DWM API 提供,讓您的應用程式能夠比對用戶端 UI 與系統色彩主題。

若要存取此著色值並監視色彩變更,請使用 DwmGetColorizationColor 函式和 WM_DWMCOLORIZATIONCOLORCHANGED 訊息。

此範例示範如何處理色彩變更的訊息,並存取新的色彩。

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

控制非用戶端區域轉譯

DWM 啟用的兩個視覺效果是視窗非用戶端區域的透明度,以及轉換效果。 您的應用程式可能需要針對樣式或相容性原因停用或重新啟用這些效果。 下列函式可用來管理透明度和轉換效果行為。

若要擷取應用程式視窗目前的非用戶端轉譯狀態,請呼叫 DwmGetWindowAttribute 並將 dwAttribute 設定為 DWMWA_NCRENDERING_ENABLED。 如您所見,當您將該旗標傳遞給DwmGetWindowAttribute時,DWMWA_NCRENDERING_ENABLED 所擷取的屬性值的類型為BOOL。 不同的旗標會導致 DwmGetWindowAttribute 傳回不同類型的值。 以下是程式碼範例。

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

下一個範例示範如何搭配DwmGetWindowAttribute使用DWMWA_EXTENDED_FRAME_BOUNDS旗標來擷取視窗的延伸框架界限矩形。 該旗標的檔會告訴我們擷取的屬性值的類型為 RECT

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

注意

當您使用不同屬性的旗標呼叫 DwmGetWindowAttribute 時,請遵循上述相同的程式設計模式。 DWMWINDOWATTRIBUTE列舉主題指出,在每個旗標的資料列中,您應該在DwmGetWindowAttributepvAttribute參數中傳遞指向的數值型別。 cbAttribute參數包含該物件的大小,以位元組為單位。

DwmSetWindowAttribute 可讓應用程式設定非工作區轉譯原則。 該函式也會決定您的應用程式如何處理 DWM 轉換效果。

下一個範例會停用非工作區轉譯。 這會導致任何先前對 DwmEnableBlurBehindWindowDwmExtendFrameIntoClientArea 的呼叫停用。

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

除了控制非工作區轉譯之外, DwmSetWindowAttribute 也可以控制 DWM 轉換效果。 您可以使用 DWMWA_TRANSITIONS_FORCEDISABLED 作為 dwAttribute 參數來設定轉換行為。

訊息

下列訊息會提供 DWM 事件的通知。 這些訊息可用來監視變更,例如組合狀態變更和系統色彩主題變更。

停用 Windows 7 和更早版本的 DWM (組合)

警告

本節中的資訊僅適用于 Windows 7 和舊版系統。

因為 DWM 使用圖形處理器 (GPU) 進行桌面組合,所以您的應用程式可能必須停用 DWM 以取得相容性。 完全控制桌面的應用程式,例如以全螢幕模式執行的遊戲,必須判斷是否已啟用 DWM,如果已啟用,請加以停用。 若要這樣做,需要兩個函式。

呼叫DwmEnableComposition並將 fEnable設定為DWM_EC_DISABLECOMPOSITION會停用 DWM 組合,直到呼叫進程關閉,或呼叫DwmEnableComposition 並將 fEnable 設定DWM_EC_ENABLECOMPOSITION來重新啟用組合。 只要所有已停用組合的應用程式都已關閉,或呼叫 DwmEnableComposition手動重新啟用組合,DWM 組合就會自動重新開機。

注意

當應用程式嘗試直接繪製到主要顯示介面時,DWM 會自動停用組合。 組合將會停用,直到該應用程式釋放主要裝置介面為止。