IDXGIFactory::MakeWindowAssociation メソッド (dxgi.h)

DXGI がアプリケーションのメッセージ キューで alt キー入力キー シーケンスを監視できるようにします (これにより、アプリケーションがウィンドウから全画面表示に切り替わります)。その逆も可能です。

構文

HRESULT MakeWindowAssociation(
  HWND WindowHandle,
  UINT Flags
);

パラメーター

WindowHandle

種類: HWND

監視するウィンドウのハンドル。 このパラメーターには NULL を指定できます。 ただし、Flags も 0 の場合のみ。

Flags

型: UINT

次の値のうち 1 つ以上。

  • DXGI_MWA_NO_WINDOW_CHANGES - DXGI がアプリケーション メッセージ キューを監視できないようにします。これにより、DXGI はモードの変更に応答できなくなります。
  • DXGI_MWA_NO_ALT_ENTER - DXGI が alt-enter シーケンスに応答しないようにします。
  • DXGI_MWA_NO_PRINT_SCREEN - DXGI が印刷画面キーに応答しないようにします。

戻り値

型: HRESULT

WindowHandleが無効な場合、またはE_OUTOFMEMORY場合にDXGI_ERROR_INVALID_CALLします。

解説

メモ セッション 0 プロセスでこの API を呼び出すと、 DXGI_ERROR_NOT_CURRENTLY_AVAILABLEが返されます。
 
WindowHandleFlags の組み合わせにより、DXGI は、以前に関連付けられたウィンドウのウィンドウ メッセージの監視を停止するように通知します。

アプリケーションが全画面表示モードに切り替わる場合、DXGI は、現在のバック バッファー サイズと同じサイズまたは大きい、サポートされている最小の解像度に全画面表示解像度を選択します。

アプリケーションでは、ウィンドウから全画面表示への移行をより効率的にするために、いくつかの変更を加えることができます。 たとえば、WM_SIZE メッセージでは、アプリケーションは未処理のスワップ チェーン バック バッファーを解放し、 IDXGISwapChain::ResizeBuffers を呼び出してから、スワップ チェーンからバック バッファーを再取得する必要があります。 これにより、スワップ チェーンはバック バッファーのサイズを変更したり、それらを再作成して全画面表示の反転操作を有効にしたりできます。 アプリケーションがこのシーケンスを実行しない場合、DXGI は引き続き全画面表示/ウィンドウ切り替えを行いますが、(バック バッファーが正しいサイズではない可能性があるため) ストレッチ操作を強制的に使用する可能性があり、効率が低下する可能性があります。 ストレッチが不要な場合でも、バック バッファーがフロント バッファーと直接交換できない可能性があるため、プレゼンテーションが最適でない可能性があります。 したがって、WM_SIZEの ResizeBuffers の呼び出しは常に推奨されます。WM_SIZEは常に全画面表示の切り替え中に送信されるためです。

ウィンドウが表示されている間、アプリケーションは選択した場合、ウィンドウのクライアント領域のサイズを、快適なレンダリングのサイズに制限できます。 完全に柔軟なアプリケーションではそのような制限はありませんが、UI 要素やその他の設計上の考慮事項により、この柔軟性が実現できなくなります。 さらに、アプリケーションがウィンドウのクライアント領域を、サポートされている全画面表示の解像度に一致するもののみに制限することを選択した場合、アプリケーションは idXGIOutput::FindClosestMatchingMode に対してWM_SIZINGをチェックできます。 一致モードが見つかった場合は、サイズ変更を許可します。 (IDXGIOutput は 、IDXGISwapChain::GetContainingOutput から取得できます。デスクトップ トポロジに対する後続の変更がない場合、これは alt キーを押しながら Enter キーを押して、そのスワップ チェーンに対して全画面表示モードが開始されたときに選択されるのと同じ出力になります)。

モードの変更を処理するアプリケーション、または Alt キーを押しながら Enter キーを押すアプリケーションでは、スワップ チェーンの作成後に、DXGI_MWA_NO_WINDOW_CHANGES フラグを使用 して MakeWindowAssociation を 呼び出す必要があります。 引数 WindowHandle は、NULL 以外の場合、特定のターゲット HWND のすべてのスワップ チェーンに対して、アプリケーション メッセージ キューが DXGI ランタイムによって処理されないことを指定します。 スワップチェーンの作成後に makeWindowAssociation を DXGI_MWA_NO_WINDOW_CHANGES フラグと共に呼び出すと、DXGI がアプリケーションによるウィンドウ モードの変更や Alt + Enter の処理に干渉しないようにすることができます。

ターゲット HWND スワップ チェーンに関連付けられているファクトリ オブジェクトで MakeWindowAssociation メソッドを呼び出す必要があります。 これは、スワップ チェーンで IDXGIObject::GetParent メソッドを呼び出してファクトリを検索することで保証できます。 これを行うコード例を次に示します。

void MakeWindowAssociationWithLocatedFactory(
    winrt::com_ptr<IDXGISwapChain> const& swapChain,
    HWND hWnd,
    UINT flags)
{
    winrt::com_ptr<IDXGIFactory1> factory;
    factory.capture(swapChain, &IDXGISwapChain::GetParent);
    factory->MakeWindowAssociation(hWnd, flags);
}

Windows ストア アプリに関するメモ

Windows ストア アプリが MakeWindowAssociation を呼び出すと、 DXGI_ERROR_NOT_CURRENTLY_AVAILABLEで失敗します。

Microsoft Win32 アプリケーションでは 、MakeWindowAssociation を 使用して、Alt キーと Enter キーの組み合わせを使用して全画面表示の画面切り替えを制御し、全画面表示の画面動作を印刷できます。 Windows ストア アプリの場合、DXGI では全画面表示の切り替えを実行できないため、Windows ストア アプリでは全画面表示の切り替えを制御できません。

要件

   
対象プラットフォーム Windows
ヘッダー dxgi.h
Library DXGI.lib

関連項目

DXGI インターフェイス

IDXGIFactory