You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术求助:如何正确使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:24:52