如何检索类似于Windows内置混音器应用程序中的音频会话名称?



我正在构建一个混音器应用程序,需要为每个音频会话获得用户友好的名称。

我试着:

  1. IAudioSessionControl::GetDisplayName()方法,但每次会话返回空字符串。

  2. 调用QueryFullProcessImageName()GetModuleFileNameEx(),但它们只输出C:Users,因为我在路径中有西里尔字母。但即使他们确实输出了完整的路径,我认为它会以...brave.exe这样的东西结束(如果我错了请纠正我),这不是一个像Windows内置混频器中的Brave Browser这样的用户友好名称。

  3. 我还尝试获得所有进程名称和pid这样,后来将它们与会话进程id相匹配,成功地给了我像chrome.exesteam.exe这样的名称,但它们仍然,再一次,不完全是我想要的:

    std::vector<std::pair<DWORD, wchar_t*>> processes;
    HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 entry;
    entry.dwSize = sizeof(PROCESSENTRY32);
    Process32First(handle, &entry);
    do {
    processes.emplace_back(entry.th32ProcessID, entry.szExeFile);
    } while (Process32Next(handle, &entry));
    CloseHandle(handle);
    

我想要的是检索名称,如在内置的混音器应用程序,即Steam,Chrome Browser,Zoom Meetings,等。

有办法做到这一点吗?或者微软在这里使用了某种黑魔法?

调用QueryFullProcessImageName()GetModuleFileNameEx(),但它们只输出C:Users,因为路径中有西里尔字母。

那么您只是没有正确显示路径。西里尔字符的存在不是问题。

我还尝试获得所有进程名称和pid这样,后来将它们与会话进程id匹配,成功地给了我像chrome.exesteam.exe这样的名称,但它们仍然,再一次,不完全是我想要的

代码不能正常工作。在std::vector中存储指向单个wchar_t[]缓冲区的指针,该缓冲区在每次循环迭代时被修改。您应该存储std::wstring而不是wchar_t*,以便复制每个路径。

我想要的是检索名称,如在内置的混音器应用程序,即Steam,Chrome Browser,Zoom Meetings等。

一旦你有了EXE的路径,你可以使用GetFileVersionInfo()VerQueryValue()来检索应用程序的人类可读的FileDescription。参见使用VerQueryValue检索应用程序的文件描述。

最新更新