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。 然后,您可以调用此函数以读取屏幕截图。 startPosition 和 bytesToRead 参数将允许您读取屏幕截图的一部分,这对于读取较大的流(一次一个部分)非常有用。 您可以从 XAppCaptureOpenScreenShotStream 的 totalBytes 输出参数中获取流的总大小。 输出参数 buffer 和 bytesWritten 将帮助您准确地读取从此函数返回的数据。 在读取屏幕截图数据后,使用 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