> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# XAppCaptureReadScreenshotStream

> XAppCaptureReadScreenshotStream

# XAppCaptureReadScreenshotStream

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

## 構文

```cpp theme={null}
HRESULT XAppCaptureReadScreenshotStream(  
         XAppCaptureScreenshotStreamHandle handle,  
         uint64_t startPosition,  
         uint32_t bytesToRead,  
         uint8_t* buffer,  
         uint32_t* bytesWritten  
)  
```

### パラメーター

*handle*   \_In\_\
型: XAppCaptureScreenshotStreamHandle

[XAppCaptureOpenScreenshotStream](/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream) を呼び出して返されたスクリーンショット ストリーム ハンドルです。

*startPosition*   \_In\_\
型: uint64\_t

読み取りを開始するストリーム内の位置です。

*bytesToRead*   \_In\_\
型: uint32\_t

ストリームで読み取るバイト数です。

*buffer*   \_Out\_writes\_to\_(bytesToRead,*bytesWritten)\
型: uint8\_t*

**XAppCaptureReadScreenshotStream** で読み取ったバイトを格納するバッファーです。

*bytesWritten*   \_Out\_\
型: uint32\_t\*

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

### 戻り値

型: HRESULT

関数の結果です。

## 解説

<Note>この関数は、時間依存スレッドで呼び出しても安全ではありません。 詳細については、「[Time-sensitive threads](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)」を参照してください。</Note>

スクリーンショットを読み取る前に、[XAppCaptureOpenScreenShotStream](/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream) でスクリーンショット ストリームを開く必要があります。 これにより、*handle* パラメーターに必要な **XAppCaptureScreenshotStreamHandle** が生成されます。 その後、この関数を呼び出してスクリーンショットを読み取ることができます。 *startPosition* パラメーターと *bytesToRead* パラメーターにより、スクリーンショットの一部分を読み取ることができます。これは、大きなストリームを一度に一部分ずつ読み取るのに便利です。 ストリームの合計サイズは、[XAppCaptureOpenScreenShotStream](/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream) の *totalBytes* 出力パラメーターから取得できます。 出力パラメーター *buffer* と *bytesWritten* は、この関数から返されるデータを正確に読み取るのに役立ちます。 スクリーンショット データを読み取った後、メモリ リークを避けるため、[XAppCaptureCloseScreenshotStream](/reference/system/xappcapture/functions/xappcaptureclosescreenshotstream) でスクリーンショット ストリームを閉じます。

```cpp theme={null}
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 本体

## 概念ドキュメント

* [Time-sensitive threads](https://learn.microsoft.com/gaming/gdk/docs/gdk-dev/console-dev/overviews/threads/time-sensitive-threads)

## 関連項目

[GameDVR の概要](/build/console-features/game-dvr/gamedvr-broadcast)\
[XAppCapture メンバー](/reference/system/xappcapture/xappcapture_members)\
[XAppCaptureOpenScreenShotStream](/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream)\
[XAppCaptureTakeScreenshot](/reference/system/xappcapture/functions/xappcapturetakescreenshot)\
[XAppCaptureCloseScreenshotStream](/reference/system/xappcapture/functions/xappcaptureclosescreenshotstream)


## Related topics

- [XAppCaptureTakeScreenshot](/ja-jp/reference/system/xappcapture/functions/xappcapturetakescreenshot.md)
- [XAppCaptureScreenshotStream](/ja-jp/reference/system/xappcapture/structs/xappcapturescreenshotstream.md)
- [XAppCapture](/ja-jp/reference/system/xappcapture/xappcapture_members.md)
- [GDK 向け Unity C# API ラッパー](/ja-jp/build/gdk-and-engines/unity/unity-api-wrappers.md)
- [XAppCaptureOpenScreenshotStream](/ja-jp/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream.md)
