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*

实际写入缓冲区的字节数。

返回值

类型:HRESULT

函数结果。

备注

注意

在时间敏感线程上调用此函数是不安全的。 有关详细信息,请参阅时间敏感线程

在读取屏幕截图之前,您必须使用 XAppCaptureOpenScreenShotStream 打开屏幕截图流。 这将生成 handle 参数所需的 XAppCaptureScreenshotStreamHandle。 然后,您可以调用此函数以读取屏幕截图。 startPositionbytesToRead 参数将允许您读取屏幕截图的一部分,这对于读取较大的流(一次一个部分)非常有用。 您可以从 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 主机

另请参阅

GameDVR 概述
XAppCapture 成员
XAppCaptureOpenScreenShotStream
XAppCaptureTakeScreenshot
XAppCaptureCloseScreenshotStream