> ## 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>이 함수는 시간에 민감한 스레드에서 호출하기에 안전하지 않습니다. 자세한 내용은 [시간에 민감한 스레드](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 콘솔

## 개념 설명서

* [시간에 민감한 스레드](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](/ko/reference/system/xappcapture/functions/xappcapturetakescreenshot.md)
- [XAppCaptureScreenshotStream](/ko/reference/system/xappcapture/structs/xappcapturescreenshotstream.md)
- [XAppCapture](/ko/reference/system/xappcapture/xappcapture_members.md)
- [GDK용 Unity C# API 래퍼](/ko/build/gdk-and-engines/unity/unity-api-wrappers.md)
- [XAppCaptureOpenScreenshotStream](/ko/reference/system/xappcapture/functions/xappcaptureopenscreenshotstream.md)
