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

如何用PowerShell结合NAudio获取当前播放音频的应用名称

在PowerShell中使用NAudio 1.9获取Windows 11音频会话的解决方案

问题分析

你遇到的Audio Sessions始终为空问题,核心原因是原版代码未正确激活NAudio 1.9版本中的IAudioSessionManager2 COM接口,且可能缺少必要的系统权限。

解决步骤

  1. 以管理员身份运行PowerShell:读取音频会话信息需要系统权限,普通权限下会限制访问会话数据。
  2. 修正代码逻辑:使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 17:27:52