如何使用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
相关产品推荐
相关产品推荐

