次の方法で共有


XAppCaptureReadScreenshotStream

スクリーンショット ストリーミングを読み取ります。

構文

HRESULT XAppCaptureReadScreenshotStream(  
         XAppCaptureScreenshotStreamHandle handle,  
         uint64_t startPosition,  
         uint32_t bytesToRead,  
         uint8_t* buffer,  
         uint32_t* bytesWritten  
)  

パラメーター

handle _In_
型: XAppCaptureScreenshotStreamHandle

XAppCaptureOpenScreenshotStream の呼び出しによって返されるスクリーンショット ストリーミング ハンドル。

startPosition _In_
型: uint64_t

ストリーミングの中で読み取りを開始する位置。

bytesToRead _In_
型: uint32_t

読み取るストリーミングのバイト数。

buffer _Out_writes_to_(bytesToRead,bytesWritten)
型: uint8_t

XAppCaptureReadScreenshotStream によって読み取られたバイトを格納するバッファー。

bytesWritten _Out_
型: uint32_t*

buffer に実際に書き込まれたバイト数。

戻り値

型: HRESULT

関数の結果です。

解説

注意

この関数は、時間依存のスレッドで呼び出すのに安全ではありません。 詳細については、「時間依存のスレッド」をご覧ください。

スクリーンショットを読む前に、XAppCaptureOpenScreenShotStream でスクリーンショットストリームを開く必要があります。 これにより、handle パラメーターに必要な XAppCaptureScreenshotStreamHandle が生成されます。 その後、この関数を呼び出してスクリーンショットを読み取ることができます。 startPosition パラメーターと bytesToRead パラメータを使用して、スクリーンショットのセクションを読み取ることができます。これは、一度で大きなストリームのセクションを読み取るのに便利です。 XAppCaptureOpenScreenShotStreamtotalBytes 出力パラメーターで、ストリーミングの合計サイズを取得できます。 出力パラメーター bufferbytesWritten は、この関数から返されたデータを正確に読み取るのに役立ちます。 スクリーンショット データを読み取った後は、メモリ リークを避けるため、XAppCaptureCloseScreenshotStream でスクリーンショット ストリーミングを閉じます。

const int MAX_DATA = 1024;

XAppCaptureTakeScreenshotResult takeScreenshotResult = {0};
XAppCaptureScreenshotStreamHandle handle = nullptr;
XAppCaptureScreenshotFormatFlag screenshotFormat = XAppCaptureScreenshotFormatFlag::SDR;

BYTE buffer[MAX_DATA];
HANDLE file = INVALID_HANDLE_VALUE;
UINT64 totalBytesRead = 0;
UINT64 totalBytesToRead = 0;
bool hdrAvailable = false;

/* ... obtain takeScreenshotResult with XAppCaptureTakeScreenshot. Refer to corresponding documentation ... */

hdrAvailable = static_cast<bool>(takeScreenshotResult.availableScreenshotFormats & XAppCaptureScreenshotFormatFlag::HDR);

/* Note: It is optional to obtain the HDR screenshot, if HDR is available. You will need to call XAppCaptureOpenScreenshotStream twice to obtain both SDR and HDR screenshots */
if (hdrAvailable)
{
    screenshotFormat = XAppCaptureScreenshotFormatFlag::HDR;
}

if (FAILED_LOG(XAppCaptureOpenScreenshotStream(takeScreenshotResult.localId, screenshotFormat, &handle, &totalBytesToRead)))
{
    return;
}

/* T:\ is one example of a writeable local directory. Be aware that the T:\ drive can be invalidated on suspend or resume, and as such it's better to use Persistant Local Storage */
file = CreateFileA(hdrAvailable ? "T:\\MyScreenshot.jxr" : "T:\\MyScreenshot.png", GENERIC_READ | GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (file == INVALID_HANDLE_VALUE)
{
    /* You must always call XAppCaptureCloseScreenshotStream on an open XAppCaptureScreenshotStreamHandle to avoid a memory leak */
    FAILED_LOG(XAppCaptureCloseScreenshotStream(handle));
    return;
}

while (totalBytesRead < totalBytesToRead)
{
    uint32_t bytesRead = 0;
    uint32_t bytesWritten = 0;
    if (SUCCEEDED(XAppCaptureReadScreenshotStream(handle, totalBytesRead, sizeof(buffer), buffer, &bytesRead)))
    {
        WriteFile(file, buffer, bytesRead, &bytesWritten, NULL);

        totalBytesRead += bytesRead;
    }
    else
    {
        break;
    }
}

FAILED_LOG(XAppCaptureCloseScreenshotStream(handle));

CloseHandle(file);

要件

ヘッダー: XAppCapture.h

ライブラリ: xgameruntime.lib

サポートされているプラットフォーム: Windows、Xbox One ファミリー本体、Xbox Series 本体

関連項目

ゲーム録画の概要
XAppCapture のメンバー
XAppCaptureOpenScreenShotStream
XAppCaptureTakeScreenshot
XAppCaptureCloseScreenshotStream