我正在构建一个混音器应用程序,需要为每个音频会话获得用户友好的名称。
我试着:
-
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
,等。
有办法做到这一点吗?或者微软在这里使用了某种黑魔法?
调用
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
。参见使用VerQueryValue检索应用程序的文件描述。