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

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

我试过了:

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

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

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

【问题讨论】:

标签: c++ winapi


【解决方案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

【讨论】:

  • 你就是上帝本人吗?谢谢,这就像一个魅力!
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 2021-10-05
  • 2018-07-01
  • 1970-01-01
  • 2011-03-20
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多