啟用和控制 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。 如 DWMWA_NCRENDERING_ENABLED檔所示,當您將旗標傳遞至 DwmGetWindowAttribute時,所擷取的屬性值的類型 BOOL。 不同的旗標會導致 DwmGetWindowAttribute 傳回不同類型的值。 以下是程式代碼範例。
BOOL isNCRenderingEnabled{ FALSE };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_NCRENDERING_ENABLED,
&isNCRenderingEnabled,
sizeof(isNCRenderingEnabled));
下一個範例示範如何使用 DWMWA_EXTENDED_FRAME_BOUNDS 旗標搭配 DwmGetWindowAttribute 來擷取視窗的延伸框架界限矩形。 該旗標的檔案會告訴我們所擷取的屬性值的類型 RECT。
RECT extendedFrameBounds{ 0,0,0,0 };
HRESULT hr = ::DwmGetWindowAttribute(hWnd,
DWMWA_EXTENDED_FRAME_BOUNDS,
&extendedFrameBounds,
sizeof(extendedFrameBounds));
注意
當您呼叫 DwmGetWindowAttribute 時,請遵循上面顯示的相同程序設計模式,並搭配不同屬性的旗標。 DWMWINDOWATTRIBUTE 列舉主題指出,在每個旗標的資料列中,您應該在 pvAttribute 參數中傳遞指標給 DwmGetWindowAttribute。 cbAttribute 參數包含該物件的大小,以位元組為單位。
DwmSetWindowAttribute 可讓您的應用程式設定非工作區轉譯原則。 該函式也會決定您的應用程式如何處理 DWM 轉換效果。
下一個範例會停用非工作區轉譯。 這會導致 DwmEnableBlurBehindWindow 或 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;
}
除了控制非工作區轉譯之外,DwmSetWindowAttribute 也可以控制 DWM 轉換效果。 您可以使用 DWMWA_TRANSITIONS_FORCEDISABLED 作為 dwAttribute 參數來設定轉換行為。
消息
下列訊息提供 DWM 事件的通知。 這些訊息可用來監視變更,例如組合狀態變更和系統色彩主題變更。
- WM_DWMCOLORIZATIONCOLORCHANGED
- WM_DWMCOMPOSITIONCHANGED
- WM_DWMNCRENDERINGCHANGED
- WM_DWMWINDOWMAXIMIZEDCHANGE
停用 DWM 組合 (Windows 7 和更早版本)
警告
本節中的資訊僅適用於 Windows 7 和舊版系統。
由於 DWM 使用圖形處理單元 (GPU) 進行桌面組合,因此您的應用程式可能必須停用 DWM 以符合相容性。 完全控制桌面的應用程式,例如以全螢幕模式執行的遊戲,必須判斷 DWM 是否已啟用,如果已啟用,請將其停用。 若要這樣做,需要兩個函式。
DwmEnableComposition 的呼叫,fEnable 設為 DWM_EC_DISABLECOMPOSITION 會停用 DWM 組合,直到呼叫程式已關閉,或呼叫 DwmEnableCompositionfEnable 設為 DWM_EC_ENABLECOMPOSITION來重新啟用組合。 一旦停用組合的所有應用程式都已關閉,或呼叫 dwmEnableComposition 手動重新啟用組合,DWM 組合就會自動重新啟動。
注意
當應用程式嘗試直接繪製到主要顯示介面時,DWM 會自動停用組合。 組合將會停用,直到該應用程式釋放主要裝置介面為止。