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

如何使用C#列出当前正在播放声音的音频设备

实现思路与步骤

我们基于Windows原生的CoreAudio API实现该功能,搭配.NET生态常用的NAudio音频库完成开发,无需复杂的第三方工具适配。

第一步:安装依赖库

直接通过NuGet安装NAudio即可,操作步骤:

  • 右键你的WPF项目,选择「管理NuGet程序包」
  • 搜索NAudio,安装最新稳定版即可

第二步:核心功能实现

Windows的音频输出设备叫渲染设备,我们只需要筛选出当前有活跃音频会话的渲染设备,就是正在播放声音的设备。

后台逻辑代码

using NAudio.CoreAudioApi;
using System.Windows;

namespace YourProjectName
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void QueryActiveDevicesBtn_Click(object sender, RoutedEventArgs e)
        {
            // 初始化音频设备枚举器
            MMDeviceEnumerator deviceEnumerator = new MMDeviceEnumerator();
            // 获取所有系统可用的音频输出设备
            MMDeviceCollection allRenderDevices = deviceEnumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active);

            // 清空上次查询的结果
            ActiveDevicesList.Items.Clear();

            foreach (MMDevice device in allRenderDevices)
            {
                bool isDevicePlaying = false;
                // 遍历设备下的所有音频会话,判断是否有正在播放的会话
                for (int i = 0; i < device.AudioSessionManager.Sessions.Count; i++)
                {
                    var session = device.AudioSessionManager.Sessions[i];
                    // 会话状态为Active代表正在播放
                    if (session.State == AudioSessionState.AudioSessionStateActive)
                    {
                        isDevicePlaying = true;
                        break;
                    }
                }

                if (isDevicePlaying)
                {
                    // 你也可以根据需要取设备的ID、当前音量等其他属性
                    ActiveDevicesList.Items.Add(device.FriendlyName);
                }
            }
        }
    }
}

测试用XAML界面代码

你可以直接用这个简单界面测试功能:

<Window x:Class="YourProjectName.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="活跃音频设备查询" Height="450" Width="800">
    <Grid Margin="20">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Button x:Name="QueryActiveDevicesBtn" Content="查询正在播放声音的设备" 
                Click="QueryActiveDevicesBtn_Click" FontSize="16" Padding="10" Margin="0 0 0 15"/>
        <ListBox x:Name="ActiveDevicesList" Grid.Row="1" FontSize="14"/>
    </Grid>
</Window>

关键代码说明

  • MMDeviceEnumerator:NAudio封装的Windows原生音频设备枚举类,专门用于遍历系统音频设备
  • DataFlow.Render:指定只筛选输出声音的渲染设备,如果你需要查询正在录音的输入设备,改为DataFlow.Capture即可
  • DeviceState.Active:过滤掉已禁用、未连接的无效设备,只保留系统当前可用的设备
  • AudioSessionState.AudioSessionStateActive:每个播放音频的程序都会在对应设备上创建独立音频会话,只要有一个会话处于激活状态,就说明设备正在播放声音

注意事项

  • 该实现依赖Windows原生API,仅支持Windows系统运行,跨平台场景需要单独适配
  • 如果检测不到UWP应用的播放声音,需要在项目打包清单中添加audioCapture权限
  • 如果需要实时监听设备播放状态变化,可以订阅AudioSession的状态变更事件,无需每次手动触发查询

内容的提问来源于stack exchange,提问作者yiyitK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 02:12:11