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

如何通过IAudioSessionControl2获取音频会话对应的应用名称

Windows音频会话获取对应应用程序名称实现方案

不要走字符串截取会话标识串、解析GUID的弯路:你当前获取到的SessionInstanceIdentifier是多段拼接的复合会话标识,里面包含的GUID一部分关联音频端点设备、一部分是会话随机实例标识,和应用身份没有固定映射关系,不存在从这类GUID解析出应用名的方法;而硬编码截取标识串里的路径片段属于依赖未公开实现细节的方案,不同Windows版本、不同应用类型(桌面程序、UWP、沙箱应用)的串格式可能变动,兼容性极差。

正确实现步骤如下:

  • 第一步:通过IAudioSessionControl2接口的GetProcessId方法,直接获取当前音频会话关联的进程ID
    参考实现代码:
    DWORD associatedPid = 0;
    HRESULT hr = pSessionControl2->GetProcessId(&associatedPid);
    
  • 第二步:根据拿到的进程ID获取进程信息
    • 如果返回的PID为0,说明是系统自带的声音会话,直接标注为「系统声音」即可
    • 如果PID不为0,以PROCESS_QUERY_LIMITED_INFORMATION权限打开进程句柄,调用QueryFullProcessImageNameW获取进程的可执行文件完整路径
    • 最简应用名可以直接从完整路径里提取exe文件名;如果需要更友好的显示名称,可以进一步读取exe文件的版本资源,提取FileDescription字段的内容,就能拿到用户平时在任务管理器里看到的应用名(比如提取到「微信」而不是「WeChat.exe」)
      参考代码片段:
    if (SUCCEEDED(hr) && associatedPid != 0)
    {
        HANDLE hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, associatedPid);
        if (hProc)
        {
            wchar_t exeFullPath[MAX_PATH] = {0};
            DWORD pathBufLen = MAX_PATH;
            if (QueryFullProcessImageNameW(hProc, 0, exeFullPath, &pathBufLen))
            {
                // 此处从exeFullPath解析文件名、读取版本信息获取友好名即可
            }
            CloseHandle(hProc);
        }
    }
    
  • 额外说明:你之前调用CLSIDFromString解析整个实例标识串返回失败是正常现象,因为整个串本身就不是单个合法的GUID格式,强行拆分串内的GUID段也无法得到应用相关信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:24:38