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

Posted

技术标签:

【中文标题】如何检索类似于 Windows 内置混音器应用程序中的音频会话名称?【英文标题】:How to retrieve audio session name similar to one in Windows' built-in mixer app? 【发布时间】:2021-09-02 20:11:13 【问题描述】:

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

我试过了:

    IAudiosessionControl::GetDisplayName() 方法,但它为每个会话返回空字符串。

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

    我还尝试像这样获取所有进程名称和 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);
    

我想要的是检索内置混音器应用程序中的名称,即SteamChrome BrowserZoom Meetings 等。

有没有办法做到这一点?还是微软在这里使用了某种黑魔法?

【问题讨论】:

好像你想获取进程主HWND(***.com/questions/1888863/…)然后在上面使用GetWindowText 【参考方案1】:

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

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

我也尝试像这样获取所有进程名称和 PID,然后将它们与会话进程 ID 匹配,这成功地给了我像 chrome.exesteam.exe 这样的名称,但它们仍然不是我想要的

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

我想要的是检索内置混音器应用程序中的名称,即SteamChrome BrowserZoom Meetings 等。

获得 EXE 的路径后,您可以使用GetFileVersionInfo()VerQueryValue() 检索应用程序的人类可读的FileDescription。见Retrieve File Description for an Application using VerQueryValue。

【讨论】:

你就是上帝本人吗?谢谢,这就像一个魅力!

以上是关于如何检索类似于 Windows 内置混音器应用程序中的音频会话名称?的主要内容,如果未能解决你的问题,请参考以下文章

Windows XP 中的“按应用程序”混音器

windows编程:在没有支持“立体声混音”的驱动程序的情况下抓取音频

如何检索 Unicode CSV 剪贴板数据 MS Windows XP?

怎么删除windows10下的内置软件

Tradingview Pine脚本-如何使自定义音量指示器的行为类似于内置的Vol

Mysql 如何实现全文检索,关键词跑分