Win32 API 日本語リファレンス
ホームGraphics.Dxgi › IDXGIOutputDuplication

IDXGIOutputDuplication

COM
IID191cfac3-a341-470d-b26e-a864f428319c継承元IDXGIObject自前メソッド開始 vtbl7

公式ドキュメント

IDXGIOutputDuplication インターフェイスは、複製されたデスクトップイメージにアクセスして操作します。

解説(Remarks)

コラボレーションアプリケーションは、IDXGIOutputDuplication を使用してデスクトップイメージにアクセスできます。IDXGIOutputDuplication は、8bpp 以外の DirectX 全画面モードおよび 8bpp 以外の OpenGL 全画面モードにおいて、デスクトップ ウィンドウ マネージャー (DWM) でサポートされます。16 ビットまたは 32 ビットの GDI による非 DWM デスクトップモードはサポートされません。

アプリケーションは、別のスレッドで IDXGIOutputDuplication を使用してデスクトップイメージを受け取り、それを独自の画像処理パイプラインに渡すことができます。アプリケーションは IDXGIOutputDuplication を使用して、次の操作を実行します。

  1. 次のデスクトップイメージを取得します。
  2. イメージを記述する情報を取得します。
  3. イメージに対して操作を実行します。この操作は、アプリケーションがイメージのピクセルデータを読み取れるように、イメージをステージングバッファーにコピーするだけの単純なものにすることもできます。アプリケーションは、IDXGISurface::Map を呼び出した後にピクセルデータを読み取ります。あるいは、この操作をより複雑なものにすることもできます。たとえば、アプリケーションはイメージの更新された領域に対していくつかのピクセルシェーダーを実行し、それらの領域をクライアントへの送信用にエンコードできます。
  4. アプリケーションは各デスクトップイメージの処理を終えると、そのイメージを解放し、手順 1 に戻ってこれらの手順を繰り返します。アプリケーションは、デスクトップイメージの処理が完了するまでこれらの手順を繰り返します。
オペレーティングシステムの次のコンポーネントがデスクトップイメージを生成できます。 オペレーティングシステムがデスクトップイメージを生成する別のコンポーネントに切り替わったとき、またはモード変更が発生したときには、現在のすべての IDXGIOutputDuplication インターフェイスが無効になります。このような状況では、アプリケーションは現在の IDXGIOutputDuplication インターフェイスを破棄し、新しい IDXGIOutputDuplication インターフェイスを作成する必要があります。

IDXGIOutputDuplication が無効になる状況の例を次に示します。

このような状況では、アプリケーションは IDXGIOutputDuplication インターフェイスを解放し、新しいコンテンツ用に新しい IDXGIOutputDuplication インターフェイスを作成する必要があります。アプリケーションが新しいデスクトップイメージに対する適切な権限を持っていない場合、IDXGIOutput1::DuplicateOutput メソッドの呼び出しは失敗します。

アプリケーションが各デスクトップイメージを処理している間、オペレーティングシステムはすべてのデスクトップイメージの更新を 1 つの更新にまとめて蓄積します。デスクトップの更新の詳細については、「デスクトップイメージデータの更新」を参照してください。

デスクトップイメージは常に DXGI_FORMAT_B8G8R8A8_UNORM 形式です。

IDXGIOutputDuplication インターフェイスは、Windows ストアアプリには存在しません。

メソッド 8

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 7 void GetDesc(DXGI_OUTDUPL_DESC* pDesc)

複製された出力 (アウトプット) の記述を取得します。この記述は、デスクトップイメージを格納するサーフェスの寸法を指定します。

pDescDXGI_OUTDUPL_DESC*out複製された出力 (アウトプット) を記述する DXGI_OUTDUPL_DESC 構造体へのポインター。このパラメーターを NULL にすることはできません。

解説(Remarks)

アプリケーションは IDXGIOutputDuplication インターフェイスを作成した後、GetDesc を呼び出して、デスクトップイメージを格納するサーフェスの寸法を取得します。デスクトップイメージの形式は常に DXGI_FORMAT_B8G8R8A8_UNORM です。

vtbl 8 HRESULT AcquireNextFrame(DWORD TimeoutInMilliseconds, DXGI_OUTDUPL_FRAME_INFO* pFrameInfo, IDXGIResource** ppDesktopResource)

アプリケーションが次のデスクトップイメージを処理する準備ができたことを示します。

TimeoutInMillisecondsDWORDin

タイムアウト間隔 (ミリ秒単位)。この間隔は、このメソッドが呼び出し元に制御を返す前に新しいフレームを待機する時間を指定します。この間隔が経過しても新しいデスクトップイメージが利用できない場合、このメソッドは制御を返します。

タイムアウト間隔の詳細については、「解説」を参照してください。

pFrameInfoDXGI_OUTDUPL_FRAME_INFO*outフレームのタイミングおよび表示 (プレゼント) 統計を記述する DXGI_OUTDUPL_FRAME_INFO 構造体を受け取るメモリ位置へのポインター。
ppDesktopResourceIDXGIResource**outデスクトップビットマップを格納するサーフェスの IDXGIResource インターフェイスを受け取る変数へのポインター。

戻り値

AcquireNextFrame は次の値を返します。

解説(Remarks)

AcquireNextFrame が正常に返ると、呼び出し元のアプリケーションは、AcquireNextFrameppDesktopResource の変数に返すデスクトップイメージにアクセスできます。 呼び出し元が TimeoutInMilliseconds パラメーターにゼロのタイムアウト間隔を指定した場合、AcquireNextFrame は新しいデスクトップイメージが利用可能かどうかを確認し、直ちに制御を返して、その結果を戻り値で示します。呼び出し元が TimeoutInMilliseconds パラメーターに INFINITE のタイムアウト間隔を指定した場合、タイムアウト間隔は決して経過しません。

注意 TimeoutInMilliseconds パラメーターで指定した待機をキャンセルすることはできません。そのため、他の条件 (たとえば終了シグナル) を定期的に確認する必要がある場合は、INFINITE 以外のタイムアウト間隔を指定してください。タイムアウト間隔が経過した後、これらの他の条件を確認し、その後 AcquireNextFrame を再度呼び出して次のフレームを待機できます。
AcquireNextFrame は、オペレーティングシステムがデスクトップビットマップイメージを更新するか、ハードウェアポインターの形状または位置を変更したときに、新しいデスクトップフレームを取得します。AcquireNextFrame が取得する新しいフレームは、デスクトップイメージのみが更新されている場合、ポインターの形状または位置のみが更新されている場合、またはその両方が更新されている場合があります。
vtbl 9 HRESULT GetFrameDirtyRects(DWORD DirtyRectsBufferSize, RECT* pDirtyRectsBuffer, DWORD* pDirtyRectsBufferSizeRequired)

現在のデスクトップフレームのダーティ矩形に関する情報を取得します。

DirtyRectsBufferSizeDWORDin呼び出し元が pDirtyRectsBuffer パラメーターに渡したバッファーのサイズ (バイト単位)。
pDirtyRectsBufferRECT*outデスクトップフレームのダーティ矩形領域を識別する RECT 構造体の配列へのポインター。
pDirtyRectsBufferSizeRequiredDWORD*out

GetFrameDirtyRectspDirtyRectsBuffer のバッファーにダーティ領域に関する情報を格納するために必要なバイト数を受け取る変数へのポインター。

必要なバッファーサイズの返し方の詳細については、「解説」を参照してください。

戻り値

GetFrameDirtyRects は次の値を返します。

解説(Remarks)

GetFrameDirtyRects は、pDirtyRectsBufferSizeRequired の変数にサイズ値を格納します。この値は、GetFrameDirtyRects がダーティ領域に関する情報を格納するために必要なバイト数を指定します。この値は、pDirtyRectsBuffer に渡す今後のバッファーに割り当てるメモリ量を決定するために、次の状況で使用できます。

呼び出し元は、pDirtyRectsBufferSizeRequired に返された値を使用して、pDirtyRectsBuffer 配列に返される RECT の数を判断することもできます。

バッファーには、現在のフレームのダーティ RECT のリストが含まれます。

注意 デスクトップを視覚的に正確にコピーするには、アプリケーションはダーティ RECT を処理する前に、まずすべての移動 RECT を処理する必要があります。
vtbl 10 HRESULT GetFrameMoveRects(DWORD MoveRectsBufferSize, DXGI_OUTDUPL_MOVE_RECT* pMoveRectBuffer, DWORD* pMoveRectsBufferSizeRequired)

現在のデスクトップフレームの移動された矩形に関する情報を取得します。

MoveRectsBufferSizeDWORDin呼び出し元が pMoveRectBuffer パラメーターに渡したバッファーのサイズ (バイト単位)。
pMoveRectBufferDXGI_OUTDUPL_MOVE_RECT*outデスクトップフレームの移動された矩形領域を識別する DXGI_OUTDUPL_MOVE_RECT 構造体の配列へのポインター。
pMoveRectsBufferSizeRequiredDWORD*out

GetFrameMoveRectspMoveRectBuffer のバッファーに移動された領域に関する情報を格納するために必要なバイト数を受け取る変数へのポインター。

必要なバッファーサイズの返し方の詳細については、「解説」を参照してください。

戻り値

GetFrameMoveRects は次の値を返します。

解説(Remarks)

GetFrameMoveRects は、pMoveRectsBufferSizeRequired の変数にサイズ値を格納します。この値は、GetFrameMoveRects が移動された領域に関する情報を格納するために必要なバイト数を指定します。この値は、pMoveRectBuffer に渡す今後のバッファーに割り当てるメモリ量を決定するために、次の状況で使用できます。

呼び出し元は、pMoveRectsBufferSizeRequired に返された値を使用して、返される DXGI_OUTDUPL_MOVE_RECT 構造体の数を判断することもできます。

バッファーには、現在のフレームの移動 RECT のリストが含まれます。

注意 デスクトップを視覚的に正確にコピーするには、アプリケーションはダーティ RECT を処理する前に、まずすべての移動 RECT を処理する必要があります。
vtbl 11 HRESULT GetFramePointerShape(DWORD PointerShapeBufferSize, void* pPointerShapeBuffer, DWORD* pPointerShapeBufferSizeRequired, DXGI_OUTDUPL_POINTER_SHAPE_INFO* pPointerShapeInfo)

現在のデスクトップフレームの新しいポインター形状に関する情報を取得します。

PointerShapeBufferSizeDWORDin呼び出し元が pPointerShapeBuffer パラメーターに渡したバッファーのサイズ (バイト単位)。
pPointerShapeBuffervoid*outGetFramePointerShape が新しいポインター形状のピクセルデータをコピーして返すバッファーへのポインター。
pPointerShapeBufferSizeRequiredDWORD*out

GetFramePointerShapepPointerShapeBuffer のバッファーに新しいポインター形状のピクセルデータを格納するために必要なバイト数を受け取る変数へのポインター。

必要なバッファーサイズの返し方の詳細については、「解説」を参照してください。

pPointerShapeInfoDXGI_OUTDUPL_POINTER_SHAPE_INFO*outポインター形状情報を受け取る DXGI_OUTDUPL_POINTER_SHAPE_INFO 構造体へのポインター。

戻り値

GetFramePointerShape は次の値を返します。

解説(Remarks)

GetFramePointerShape は、pPointerShapeBufferSizeRequired の変数にサイズ値を格納します。この値は、pPointerShapeBufferSizeRequired が新しいポインター形状のピクセルデータを格納するために必要なバイト数を指定します。この値は、pPointerShapeBuffer に渡す今後のバッファーに割り当てるメモリ量を決定するために、次の状況で使用できます。

pPointerShapeInfo パラメーターは、新しいポインター形状を記述します。
vtbl 12 HRESULT MapDesktopSurface(DXGI_MAPPED_RECT* pLockedRect)

デスクトップイメージが既にシステムメモリ内にある場合に、そのデスクトップイメージへの効率的なアクセスを CPU に提供します。

pLockedRectDXGI_MAPPED_RECT*outCPU がサーフェスデータに直接アクセスするために必要なサーフェスデータを受け取る DXGI_MAPPED_RECT 構造体へのポインター。

戻り値

MapDesktopSurface は次の値を返します。

解説(Remarks)

DXGI_OUTDUPL_DESC 構造体の DesktopImageInSystemMemory メンバーが TRUE に設定されている場合、MapDesktopSurface を正常に呼び出すことができます。DesktopImageInSystemMemoryFALSE の場合、MapDesktopSurfaceDXGI_ERROR_UNSUPPORTED を返します。DXGI_OUTDUPL_DESC 構造体を取得するには、IDXGIOutputDuplication::GetDesc を呼び出します。

vtbl 13 HRESULT UnMapDesktopSurface()

IDXGIOutputDuplication::MapDesktopSurface を使用して取得したデスクトップイメージへのポインターを無効化します。

戻り値

UnMapDesktopSurface は次の値を返します。

vtbl 14 HRESULT ReleaseFrame()

アプリケーションがフレームの処理を終了したことを示します。

戻り値

ReleaseFrame は次の値を返します。

解説(Remarks)

アプリケーションは、次のフレームを取得する前に、フレームを解放する必要があります。フレームを解放すると、デスクトップビットマップを格納するサーフェスは無効になり、そのサーフェスを DirectX グラフィックス操作で使用できなくなります。

パフォーマンス上の理由から、次のフレームを取得する IDXGIOutputDuplication::AcquireNextFrame メソッドを呼び出す直前にフレームを解放することをお勧めします。クライアントがフレームを所有していない場合、オペレーティングシステムはすべてのデスクトップの更新をサーフェスにコピーします。これにより、オペレーティングシステムが発生する各フレームで同じ領域を更新すると、GPU サイクルが無駄になる可能性があります。クライアントがフレームを取得すると、クライアントはこの領域に対する最終的な更新のみを認識します。そのため、以前のフレームでの重複する更新はすべて無駄になります。クライアントがフレームを取得すると、クライアントはサーフェスを所有するため、オペレーティングシステムは更新された領域のみを追跡でき、デスクトップの更新をサーフェスにコピーできません。この動作のため、現在のフレームを解放する呼び出しと次のフレームを取得する呼び出しの間の時間を最小限に抑えることをお勧めします。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IDXGIOutputDuplication "{191CFAC3-A341-470D-B26E-A864F428319C}"
#usecom global IDXGIOutputDuplication IID_IDXGIOutputDuplication "{}"
#comfunc global IDXGIOutputDuplication_GetDesc               7 var
#comfunc global IDXGIOutputDuplication_AcquireNextFrame      8 int,var,sptr
#comfunc global IDXGIOutputDuplication_GetFrameDirtyRects    9 int,var,var
#comfunc global IDXGIOutputDuplication_GetFrameMoveRects     10 int,var,var
#comfunc global IDXGIOutputDuplication_GetFramePointerShape  11 int,sptr,var,var
#comfunc global IDXGIOutputDuplication_MapDesktopSurface     12 var
#comfunc global IDXGIOutputDuplication_UnMapDesktopSurface   13
#comfunc global IDXGIOutputDuplication_ReleaseFrame          14
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。