技术求助:如何正确使用Windows.Media.Miracast命名空间?
使用Windows.Media.Miracast实现投屏的实用指南
我之前做投屏功能的时候也碰到过一模一样的问题——这个命名空间推出时间短,网上资料真的少得可怜,还好啃完官方文档后整理出了一套可行的流程,分享给你!
先搞定基础配置
- 项目目标版本必须设为**Windows 10 1903(10.0.18362.0)**或更高,不然连命名空间都引不进来,在项目属性里就能改
- 一定要在
Package.appxmanifest中添加**Private Network (Client & Server)**权限,Miracast依赖网络发现,没这个权限直接搜不到设备
核心步骤+代码示例
1. 搜索附近的Miracast接收设备
用MiracastReceiverPicker就能扫描设备,我一般设5秒超时,足够搜到大部分设备了:
using Windows.Media.Miracast; private async Task<List<MiracastReceiver>> ScanMiracastDevices() { var devicePicker = new MiracastReceiverPicker(); // 启动扫描,5秒后返回结果 var scanResult = await devicePicker.FindAllAsync(TimeSpan.FromSeconds(5)); return scanResult.Receivers.ToList(); }
拿到列表后,就可以把设备名称显示给用户选啦。
2. 建立投屏连接
选好设备后,创建连接并设置投屏源——这里分两种情况:
投屏整个屏幕
private async Task<MiracastReceiverConnection> ConnectToSelectedDevice(MiracastReceiver selectedDevice) { // 创建连接实例 var connection = await selectedDevice.CreateConnectionAsync(); // 获取当前视图的显示源(整个屏幕) var displaySource = MiracastDisplaySource.GetForCurrentView(); await connection.SetDisplaySourceAsync(displaySource); // 启动投屏 await connection.StartAsync(); return connection; }
投屏特定窗口(比如WinUI 3窗口)
如果只想投某个窗口而不是整个屏幕,得获取窗口的ID来创建显示源:
// 假设你要投主窗口 var mainWindow = Application.Current.Windows[0]; var windowDisplaySource = MiracastDisplaySource.GetForWindowId(mainWindow.AppWindow.Id); await connection.SetDisplaySourceAsync(windowDisplaySource);
3. 控制投屏会话
连接成功后,你可以做暂停、恢复、调整分辨率这些操作:
// 暂停投屏 await connection.PauseAsync(); // 恢复投屏 await connection.ResumeAsync(); // 查看支持的分辨率,选第一个试试 var supportedResolutions = connection.SupportedDisplayResolutions; if (supportedResolutions.Any()) { await connection.SetDisplayResolutionAsync(supportedResolutions[0]); }
记得监听ConnectionStateChanged事件,处理意外断开的情况:
connection.ConnectionStateChanged += (sender, args) => { if (args.NewState == MiracastReceiverConnectionState.Disconnected) { // 比如给用户弹个提示:投屏已断开 DispatcherQueue.TryEnqueue(() => { // UI操作要放Dispatcher里 MessageBox.Show("投屏连接已断开"); }); } };
4. 断开连接并释放资源
用完投屏后,一定要记得断开连接,不然可能会占用设备资源:
private async Task DisconnectMiracast(MiracastReceiverConnection connection) { if (connection != null && connection.ConnectionState == MiracastReceiverConnectionState.Connected) { await connection.StopAsync(); connection.Dispose(); } }
踩过的坑要注意
- 权限真的很重要!一开始我没加Private Network权限,搜了半天没设备,差点怀疑人生
- 旧设备可能不支持高分辨率投屏,建议先判断
SupportedDisplayResolutions再设置,避免报错 - 如果要后台保持投屏,得配置后台任务,但系统可能会回收后台连接,尽量让应用在前台活跃
内容的提问来源于stack exchange,提问作者eocsap
相关产品推荐
相关产品推荐

