如何使用WebRTC获取当前电脑可共享应用列表,替代浏览器默认共享弹窗
这是W3C为保障用户安全设计的强制沙箱规则:所有合规的Web应用,都不允许页面JS直接枚举系统层面的可共享窗口、应用列表,防止恶意网站偷偷获取用户当前打开的应用信息、甚至未经授权截取屏幕内容。
navigator.mediaDevices.getDisplayMedia()触发的默认选择弹窗,是规范要求的必备用户授权环节,没有公开的Web API可以直接拉取这个弹窗里展示的数据源列表。
可落地的适配方案
桌面端打包应用场景(Electron/Tauri)
如果你的产品是打包为桌面客户端运行,可以完全绕开浏览器沙箱限制:
- Electron直接调用内置的
desktopCapturerAPI,传入types: ['window', 'screen']参数,即可获取所有可共享源的完整信息,包括窗口标题、实时缩略图、唯一标识ID - Tauri可以对接系统原生的窗口枚举接口,获取所有前台应用的元数据
- 拿到列表后在自定义UI渲染,用户选中对应源后,把源ID传给WebRTC捕获接口,即可替代默认弹窗逻辑。
配套Chromium扩展场景
如果必须在普通网页环境实现,可以开发配套的浏览器扩展申请特殊权限:
- 扩展申请
desktopCapture权限后,可获取系统级的可共享源枚举能力,把列表数据回传给网页端 - 用户在自定义UI完成选择后,把选中的源ID传给扩展,触发WebRTC的捕获流程即可
- 注意:该方案仅对安装了对应扩展的用户生效,且扩展需要通过浏览器应用商店审核才能分发。
纯Web端兼容方案
如果无法开发扩展、也不是桌面端应用,只能在现有规范下尽可能优化体验:
- 调用
getDisplayMedia()前,在自定义UI中提前告知用户即将弹出系统共享选择窗口,引导用户完成选择 - 可通过接口参数优化弹窗体验,比如传入
preferCurrentTab: true优先引导用户共享当前标签页,减少操作步骤 - 目前现代浏览器已经封堵了所有纯JS绕过默认弹窗的非规范方案,这类方法要么仅在老旧版本生效,要么存在安全风险,不建议生产环境使用。

内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

