如何检索类似于 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.exe
或 steam.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
等。
有没有办法做到这一点?还是微软在这里使用了某种黑魔法?
【问题讨论】:
好像你想获取进程主HWND(***.com/questions/1888863/…)然后在上面使用GetWindowText
?
【参考方案1】:
调用
QueryFullProcessImageName()
和GetModuleFileNameEx()
,但它们只输出C:\Users\
,因为路径中有西里尔字母。
那么您根本没有正确显示路径。西里尔字符的存在不是问题。
我也尝试像这样获取所有进程名称和 PID,然后将它们与会话进程 ID 匹配,这成功地给了我像
chrome.exe
或steam.exe
这样的名称,但它们仍然不是我想要的
该代码无法正常工作。您在 std::vector
中存储指向单个 wchar_t[]
缓冲区的指针,该缓冲区在每次循环迭代时都会被修改。您应该存储 std::wstring
而不是 wchar_t*
,以便复制每个路径。
我想要的是检索内置混音器应用程序中的名称,即
Steam
、Chrome Browser
、Zoom Meetings
等。
获得 EXE 的路径后,您可以使用GetFileVersionInfo()
和VerQueryValue()
检索应用程序的人类可读的FileDescription
。见Retrieve File Description for an Application using VerQueryValue。
【讨论】:
你就是上帝本人吗?谢谢,这就像一个魅力!以上是关于如何检索类似于 Windows 内置混音器应用程序中的音频会话名称?的主要内容,如果未能解决你的问题,请参考以下文章
windows编程:在没有支持“立体声混音”的驱动程序的情况下抓取音频
如何检索 Unicode CSV 剪贴板数据 MS Windows XP?