IDXGIOutput5
COM公式ドキュメント
アダプター出力(モニターなど)を表します。IDXGIOutput5 インターフェイスは、全画面サーフェスでサポートされるフォーマットの一覧を指定するための単一のメソッドを公開します。
メソッド 1
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IDXGIOutputDuplication オブジェクトが返すことのできる全画面サーフェスについて、サポートされるフォーマットの一覧を指定できるようにします。
| pDevice | IUnknown* | in | デスクトップ画像の処理に使用できる Direct3D デバイスインターフェイスへのポインター。このデバイスは、出力が接続されているアダプターから作成されている必要があります。 |
| Flags | DWORD | in | 作成するキャプチャサーフェスの種類を記述する DXGI_OUTDUPL_FLAG 列挙値のビットフィールド。 |
| SupportedFormatsCount | DWORD | in | サポートされるフォーマットの数を指定します。 |
| pSupportedFormats | DXGI_FORMAT* | in | SupportedFormatsCount の長さを持つ DXGI_FORMAT エントリの配列を指定します。 |
| ppOutputDuplication | IDXGIOutputDuplication** | out | 新しい IDXGIOutputDuplication インターフェイスを受け取る変数へのポインター。 |
戻り値
Type: HRESULT
- DuplicateOutput1 がデスクトップ複製インターフェイスを正常に作成した場合は S_OK。
- 次のいずれかの理由による場合は E_INVALIDARG:
- 指定されたデバイス(pDevice)が無効である、正しいアダプター上で作成されていない、または IDXGIFactory1(あるいは IDXGIFactory1 を継承する新しいバージョンの DXGI ファクトリインターフェイス)から作成されていない。
- 呼び出し元のアプリケーションが、既にこのデスクトップ出力を複製している。
- アプリケーションが現在のデスクトップ画像へのアクセス権を持っていない場合は E_ACCESSDENIED。たとえば、LOCAL_SYSTEM で実行されるアプリケーションのみがセキュアデスクトップにアクセスできます。
-
作成された IDXGIOutputDuplication インターフェイスが現在のデスクトップモードまたはシナリオをサポートしていない場合は DXGI_ERROR_UNSUPPORTED。たとえば、8bpp および非 DWM のデスクトップモードはサポートされません。
DuplicateOutput1 が DXGI_ERROR_UNSUPPORTED で失敗した場合、アプリケーションはデスクトップの切り替えやモード変更に関するシステム通知を待ち、その通知が発生した後に DuplicateOutput1 を再度呼び出すことができます。詳細については、デスクトップの切り替え(EVENT_SYSTEM_DESKTOPSWITCH)およびモード変更通知(WM_DISPLAYCHANGE)を参照してください。
- DXGI が同時に複製を行うアプリケーションの最大数(既定値は 4)の上限に達した場合は DXGI_ERROR_NOT_CURRENTLY_AVAILABLE。この場合、呼び出し元のアプリケーションは、他のアプリケーションが終了するまでデスクトップ複製インターフェイスを作成できません。
- セッションが現在切断されているために DuplicateOutput1 が失敗した場合は DXGI_ERROR_SESSION_DISCONNECTED。
- その他のエラーコードについては、DXGI_ERROR のトピックで説明されています。
解説(Remarks)
このメソッドを使用すると、実行中の全画面アプリケーションが使用している元のバックバッファーフォーマットを直接受け取ることができます。これに対して、元の DuplicateOutput 関数を使用した場合は、全画面サーフェスが常に 32 ビット BGRA フォーマットに変換されます。現在の全画面アプリケーションが別のバッファーフォーマットを使用している場合、32 ビット BGRA への変換によりパフォーマンスが低下します。DuplicateOutput1 を使用すると、フォーマット変換を省略できるというパフォーマンス上の利点に加え、高色数フォーマット(R10G10B10A2 など)が表示されている場合に、すべての色域を受け取ることもできます。
pSupportedFormats 配列には、ディスプレイのスキャンアウトフォーマットのみを含める必要があります。各フィーチャレベルで必要とされるスキャンアウトフォーマットについては、Direct3D フィーチャレベル 11.0 ハードウェアのフォーマットサポートを参照してください。現在の全画面バッファーフォーマットが pSupportedFormats 配列に含まれていない場合、DXGI は指定されたフォーマットのいずれかを選び、IDXGIOutputDuplication::AcquireNextFrame から戻る前に全画面バッファーをそのフォーマットに変換します。サポートされるフォーマットの一覧には、常に DXGI_FORMAT_B8G8R8A8_UNORM を含める必要があります。これはデスクトップで最も一般的なフォーマットだからです。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IDXGIOutput5 "{80A07424-AB52-42EB-833C-0C42FD282D98}" #usecom global IDXGIOutput5 IID_IDXGIOutput5 "{}" #comfunc global IDXGIOutput5_DuplicateOutput1 26 sptr,int,int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IDXGIOutput5 "{80A07424-AB52-42EB-833C-0C42FD282D98}" #usecom global IDXGIOutput5 IID_IDXGIOutput5 "{}" #comfunc global IDXGIOutput5_DuplicateOutput1 26 sptr,int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。