调用GetDisplayName返回作为GetIconPath
问题描述:
我现在有这个代码,遍历默认设备的音频会话控制(未显示)相同的结果:调用GetDisplayName返回作为GetIconPath
int sessionCount;
hr = audioSessionEnumerator->GetCount(&sessionCount);
if (FAILED(hr)) {
throw HRESULTException("audioSessionEnumerator->GetCount", hr);
}
IAudioSessionControl *audioSessionControl;
for (int i = 0; i < sessionCount; ++i) {
hr = audioSessionEnumerator->GetSession(i, &audioSessionControl);
if (FAILED(hr)) {
throw HRESULTException("audioSessionEnumerator->GetSession", hr);
}
LPWSTR displayName;
hr = audioSessionControl->GetDisplayName(&displayName);
if (FAILED(hr)) {
throw HRESULTException("audioSessionControl->GetDisplayName", hr);
}
std::wcout << displayName << std::endl;
CoTaskMemFree(displayName);
audioSessionControl->Release();
}
audioSessionEnumerator->Release();
我的混频器目前看起来是这样的:
预期的输出是:
Steam Client Bootstrapper
melodysheep - The Face of Creation
System Sounds
然而,观察到的输出为:
(blank line)
(blank line)
@%SystemRoot%\System32\AudioSrv.Dll,-202
哪一个是相同的输出时GetDisplayName
替换GetIconPath
。
上面的代码中会发生什么问题导致此问题?如果必须显示更多代码,请通知我。
答
如果您在MSDN中阅读GetDisplayName和GetIconName的注释,您会看到如果没有人设置它们,函数可以返回NULL。然后,GetIconName页面会说,如果sndvol应用程序(它有一个截图)将实际查找主窗口的图标(如果它为NULL),因此通过归纳将查找显示名称的主窗口标题不存在。
您可能想要查询具有GetProcessId方法的IAudioSessionControl2接口,该方法可能会返回客户端进程标识。在这一点上,您可以使用像this和this这样的东西来尝试从主窗口提取值以保持一致。