在 1803 可以使用 Windows.Graphics.Capture 捕获屏幕,可以用来录制应用的窗口
通过 CompositionAPI 和 win2d 可以作为 D3D 绘制,通过 Direct3D11CaptureFramePool 可以拿到其他应用的界面渲染图,这样就可以完成拿到其他窗口绘制在这个窗口内
用这个方法录屏的性能超级高,一个空的应用只做录屏占用内存只有 30M 左右,占用 CPU 几乎可以忽略,同时也不占用GPU资源,这是在底层做的优化。我猜是从显卡拿到渲染的图片的句柄,然后在win2d渲染只是复制句柄通过 DWM 渲染图层。这个方式的渲染速度基本就是跑满,同时占用资源如下图
下面请让我告诉大家如何使用
通过 GraphicsCapturePicker 可以让用户选取录制哪个应用,在开始之前需要申请权限。双击 Package.appxmanifest 文件,勾选图形捕获,请看下图
此时写一个简单的函数用来让用户选择捕获的应用
public async Task StartCaptureAsync()
{
// 让用户选择哪个应用
var picker = new GraphicsCapturePicker();
GraphicsCaptureItem item = await picker.PickSingleItemAsync();
// 如果用户有选择一个应用那么这个属性不为空
if (item != null)
{
// 忽略代码
}
}
尝试在应用加载完成调用这个方法或在按钮调用这个方法,调用这个方法将会看到下面图片
当然在你的设备上应该看到的不是这个界面,因为你打开的应用应该和我不一样
现在需要初始化 CompositionAPI 和 win2d 的资源
请写一个方法 Setup 将会在这个方法里面写初始化
private void Setup()
{
// 忽略代码
}
先定义两个字段,包括 CanvasDevice 和对应的图层,将会在创建资源的时候用到设备,在刷新界面的使用用到图层
<