UWP调用GraphicsCaptureAccess.RequestAccessAsync实现无框捕获抛出异常如何解决
无框屏幕捕获调用RequestAccessAsync异常解决方案
你遗漏了以下配置和操作步骤:
- 确认运行环境版本要求:
GraphicsCaptureAccessKind.Borderless最低支持的系统版本为 Windows 10 SDK 20348(Windows Server 2022)/ Windows 11 21H2(22000),低于该版本的系统无法调用该API,会直接抛出异常。 - 修正项目目标版本配置:除了SDK版本更新为20348外,必须在项目属性中将应用的目标版本设置为 ≥ 10.0.20348.0,最低支持版本也不能低于你当前适配的无框捕获最低系统要求。
- 增加API可用性判断:调用
RequestAccessAsync前必须先判断当前系统是否支持该API,避免在不兼容系统上调用出错:
// 先判断API是否可用 if (ApiInformation.IsTypePresent("Windows.Graphics.Capture.GraphicsCaptureAccess") && ApiInformation.IsEnumNamedValuePresent("Windows.Graphics.Capture.GraphicsCaptureAccessKind", "Borderless")) { // 再申请权限 AppCapabilityAccessStatus appCapabilityAccessStatus = await GraphicsCaptureAccess.RequestAccessAsync(GraphicsCaptureAccessKind.Borderless); }
- 调整API调用顺序:必须先申请无框捕获权限,再创建捕获会话、设置
IsBorderRequired属性,错误的调用顺序也可能触发异常。修正后的代码顺序如下:
// 1. 先判断API可用性并申请权限 if (ApiInformation.IsTypePresent("Windows.Graphics.Capture.GraphicsCaptureAccess") && ApiInformation.IsEnumNamedValuePresent("Windows.Graphics.Capture.GraphicsCaptureAccessKind", "Borderless")) { var accessStatus = await GraphicsCaptureAccess.RequestAccessAsync(GraphicsCaptureAccessKind.Borderless); if (accessStatus != AppCapabilityAccessStatus.Allowed) { // 处理权限拒绝逻辑 return; } } // 2. 再创建捕获帧池和会话 Direct3D11CaptureFramePool _framePool = Direct3D11CaptureFramePool.CreateFreeThreaded( _canvasDevice, DirectXPixelFormat.B8G8R8A8UIntNormalized, 2, _captureItem.Size); GraphicsCaptureSession _session = _framePool.CreateCaptureSession(_captureItem); // 3. 最后设置无框属性 _session.IsBorderRequired = false;
- 确认应用身份合规:只有打包的MSIX应用支持在清单中声明
uap11:Capability,如果你是未打包的桌面应用,需要额外通过侧加载或者微软商店认证才能使用无框捕获能力,未打包应用直接声明该权限不会生效。
你遇到的异常截图参考:
内容的提问来源于stack exchange,提问作者Karthik
相关产品推荐
相关产品推荐

