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

我的混频器目前看起来是这样的: Mixer

预期的输出是:

Steam Client Bootstrapper 
melodysheep - The Face of Creation 
System Sounds 

然而,观察到的输出为:

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

Output

哪一个是相同的输出时GetDisplayName替换GetIconPath

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

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

您可能想要查询具有GetProcessId方法的IAudioSessionControl2接口,该方法可能会返回客户端进程标识。在这一点上,您可以使用像thisthis这样的东西来尝试从主窗口提取值以保持一致。