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

