调用GetDisplayName会返回与GetIconPath相同的结果

时间:2014-11-23 10:48:22

标签: c++ windows audio

我目前有这段代码,迭代默认设备的音频会话控件(未显示):

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();

我的调音台目前看起来像这样: Mixer

预期输出为:

Steam Client Bootstrapper
melodysheep - The Face of Creation
System Sounds

然而,看到的输出是:

(blank line)
(blank line)
@%SystemRoot%\System32\AudioSrv.Dll,-202

Output

GetDisplayName替换GetIconPath时的输出相同。

上面的代码中出现什么问题导致此问题?如果必须显示更多代码,请通知我。

1 个答案:

答案 0 :(得分:3)

如果您在MSDN中阅读了GetDisplayNameGetIconName的备注,您会看到如果没有人设置它们,函数可以返回NULL。然后,GetIconName页面还说明sndvol应用程序(你有截图)将实际查找主窗口的图标,如果它是NULL,因此通过归纳将查找主窗口标题的显示名称,如果它不存在。

您可能希望查询具有GetProcessId方法的IAudioSessionControl2接口,该方法可能会返回客户端进程ID。此时,您可以使用thisthis之类的内容尝试从主窗口中提取值以保持一致。