我目前有这个代码,迭代默认设备的 Audio Session 控件(未显示):
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 页面还指出如果主窗口的图标为 NULL,sndvol 应用程序(您已经获得了它的屏幕截图)实际上会查找主窗口的图标,因此通过归纳将查找显示名称的主窗口标题,如果它不存在。
您可能想要查询具有 GetProcessId 方法的 IAudioSessionControl2 接口(interface),该方法可能会返回客户端进程 ID。此时,您可以使用 this 和 this 之类的东西来尝试从主窗口中提取值以保持一致。
关于c++ - 调用 GetDisplayName 返回与 GetIconPath 相同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27088100/