如何用PowerShell结合NAudio获取当前播放音频的应用名称
在PowerShell中使用NAudio 1.9获取Windows 11音频会话的解决方案
问题分析
你遇到的Audio Sessions始终为空问题,核心原因是原版代码未正确激活NAudio 1.9版本中的IAudioSessionManager2 COM接口,且可能缺少必要的系统权限。
解决步骤
- 以管理员身份运行PowerShell:读取音频会话信息需要系统权限,普通权限下会限制访问会话数据。
- 修正代码逻辑:使用NAudio 1.9的正确API枚举音频会话,调整后的代码如下:
Add-Type -Path "C:\NAudio.dll" # 初始化音频设备枚举器 $enumerator = New-Object NAudio.CoreAudioApi.MMDeviceEnumerator # 获取所有活跃的音频播放设备 $devices = $enumerator.EnumerateAudioEndPoints([NAudio.CoreAudioApi.DataFlow]::Render, [NAudio.CoreAudioApi.DeviceState]::Active) foreach ($device in $devices) { Write-Host "`n=== 设备: $($device.FriendlyName) ===" # 显式激活IAudioSessionManager2接口(NAudio 1.9版本的标准方式) $sessionManager = $device.Activate( [NAudio.CoreAudioApi.Interfaces.IAudioSessionManager2].GUID, [NAudio.CoreAudioApi.Interfaces.CLSCTX]::All, $null ) if ($sessionManager) { # 获取会话枚举器 $sessionEnumerator = $sessionManager.GetSessionEnumerator() $sessionCount = 0 # 遍历所有音频会话 while ($sessionEnumerator.MoveNext()) { $sessionCount++ $currentSession = $sessionEnumerator.Current # 通过PID关联获取进程名称 $processId = $currentSession.GetProcessID $processName = if ($processId -ne 0) { (Get-Process -Id $processId -ErrorAction SilentlyContinue).ProcessName } else { "系统进程" } Write-Host "会话 $sessionCount :" Write-Host " 显示名称: $($currentSession.DisplayName)" Write-Host " 进程名称: $processName" Write-Host " 静音状态: $($currentSession.SimpleAudioVolume.Mute)" Write-Host " 音量: $($currentSession.SimpleAudioVolume.Volume)" # 释放COM对象,避免内存泄漏 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($currentSession) | Out-Null } Write-Host "`n找到的会话总数: $sessionCount" # 释放会话相关COM对象 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($sessionEnumerator) | Out-Null [System.Runtime.InteropServices.Marshal]::ReleaseComObject($sessionManager) | Out-Null } else { Write-Host "无法激活该设备的AudioSessionManager2接口" } # 释放设备COM对象 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($device) | Out-Null } # 释放枚举器COM对象 [System.Runtime.InteropServices.Marshal]::ReleaseComObject($enumerator) | Out-Null
关键调整说明
- 用
Activate方法显式获取IAudioSessionManager2实例,替代原版直接访问AudioSessionManager2属性,这是NAudio 1.9版本的标准调用方式。 - 使用
GetSessionEnumerator()遍历会话,替换原版的Sessions属性,确保能枚举到所有有效音频会话。 - 增加PID关联进程名称的逻辑,更直观对应播放音频的应用程序。
- 加入COM对象释放逻辑,避免PowerShell内存泄漏。
额外提示
如果NAudio 1.9仍存在Windows 11兼容性问题,可重新测试NAudio 2.2.1版本:确保正确安装NuGet包,代码适配2.x版本API(2.x中AudioSessionManager2获取方式更简洁,但同样需要管理员权限)。
内容的提问来源于stack exchange,提问作者Chris P
相关产品推荐
相关产品推荐

