我目前有这个代码,迭代默认设备的 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 中 GetDisplayNameGetIconName 的备注,您会发现如果没有人设置它们,这些函数可以返回 NULL。 GetIconName 页面还指出如果主窗口的图标为 NULL,sndvol 应用程序(您已经获得了它的屏幕截图)实际上会查找主窗口的图标,因此通过归纳将查找显示名称的主窗口标题,如果它不存在。

您可能想要查询具有 GetProcessId 方法的 IAudioSessionControl2 接口(interface),该方法可能会返回客户端进程 ID。此时,您可以使用 thisthis 之类的东西来尝试从主窗口中提取值以保持一致。

关于c++ - 调用 GetDisplayName 返回与 GetIconPath 相同的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27088100/

10-10 20:13