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 で有効になる視覚効果の 2 つは、ウィンドウの非クライアント領域の透過性と遷移効果です。 アプリケーションでは、スタイル設定や互換性の理由から、これらの効果を無効にするか、再度有効にする必要がある場合があります。 透明度と遷移効果の動作を管理するには、次の関数を使用します。

アプリケーションのウィンドウの現在のクライアント以外のレンダリング状態を取得するには、dwAttributeDWMWA_NCRENDERING_ENABLED に設定して DwmGetWindowAttribute を呼び出します。 DWMWA_NCRENDERING_ENABLEDのドキュメントからわかるように、そのフラグを DwmGetWindowAttribute に渡すと、取得した属性値は BOOL 型になります。 フラグが異なると 、DwmGetWindowAttribute は異なる型の値を返します。 次にコード例を示します。

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

次の例では、DwmGetWindowAttributeDWMWA_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 遷移効果を処理する方法も決定します。

次の例では、クライアント領域以外のレンダリングを無効にします。 これにより、 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 遷移効果を制御することもできます。 移行動作は、dwAttribute パラメーターとして DWMWA_TRANSITIONS_FORCEDISABLED を使用して設定できます。

メッセージ

次のメッセージは、DWM イベントの通知を提供します。 これらのメッセージを使用して、構成状態の変更やシステムの色テーマの変更などの変更を監視できます。

DWM コンポジションの無効化 (Windows 7 以前)

警告

このセクションの情報は、Windows 7 以前のシステムにのみ適用されます。

DWM はデスクトップコンポジションにグラフィックス処理装置 (GPU) を使用するため、互換性のためにアプリケーションで DWM を無効にする必要がある場合があります。 デスクトップを完全に制御するアプリケーション (全画面表示モードで動作するゲームなど) は、DWM が有効になっているかどうか、有効になっている場合は無効にする必要があります。 これを行うには、2 つの関数が必要です。

fEnableDWM_EC_DISABLECOMPOSITION に設定した DwmEnableComposition を呼び出すと、呼び出し元のプロセスがシャットダウンするか、fEnableDWM_EC_ENABLECOMPOSITION に設定された DwmEnableComposition を呼び出してコンポジションが再び有効になるまで DWM コンポジションが無効になります。 構成が無効になっているすべてのアプリケーションがシャットダウンされるか、 DwmEnableComposition を呼び出して手動でコンポジションを再び有効にすると、DWM コンポジションが自動的に再起動されます。

注意

DWM は、アプリケーションがプライマリディスプレイ画面に直接描画しようとすると、コンポジションを自動的に無効にします。 コンポジションは、そのアプリケーションによってプライマリ デバイス サーフェスが解放されるまで無効になります。