c++ - C++ Win32 - 使用 PID 和可执行路径获取应用程序名称
问题描述
我想在 Windows 上获取应用程序的名称。目前我正在使用EnumProcesses()
枚举所有进程并接收 PID 列表。
然后我遍历所有的 PID,每次迭代看起来像这样,aProcess[i]
当前的 PID 是什么时候:
HANDLE proc = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, false, aProcesses[i]);
std::string processName = get_process_name(proc);
我的get_process_name(proc)
函数用于GetModuleFileNameEx
获取可执行路径并GetProcessImageFileName
检索可执行文件的名称。
我要检索的基本上是应用程序名称,因为它显示在 Windows 任务管理器中。
我查看了整个 Win32 API 的文档,但找不到有关如何实现这一点的线索。我尝试寻找其他方式,例如 Windows Shell 任务列表,但它输出不同的东西,例如 - Google Chrome:
Image Name: chrome.exe PID: 84 Session Name: Console
我真的很感激对此事的任何想法,无论是 Win32 API 还是我可以通过 C++ 代码实现的其他方式。
解决方案
您可以使用GetFileVersionInfoA
和来做到这一点VerQueryValueA
。
您只需要按照VerQueryValueA
文档中给出的示例进行操作即可。
这是我的示例:
struct LANGANDCODEPAGE {
WORD wLanguage;
WORD wCodePage;
} *lpTranslate;
int main()
{
HANDLE handle = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION , FALSE, 2140); //Modify pid to the pid of your application
if (!handle) return 0;
wchar_t pszFile[MAX_PATH] = L"";
DWORD len = MAX_PATH;
QueryFullProcessImageName(handle, 0, pszFile, &len);
UINT dwBytes, cbTranslate;
DWORD dwSize = GetFileVersionInfoSize(pszFile, (DWORD*)&dwBytes);
if (dwSize == 0) return 0;
LPVOID lpData = (LPVOID)malloc(dwSize);
ZeroMemory(lpData, dwSize);
if (GetFileVersionInfo(pszFile, 0, dwSize, lpData))
{
VerQueryValue(lpData,
L"\\VarFileInfo\\Translation",
(LPVOID*)&lpTranslate,
&cbTranslate);
wchar_t strSubBlock[MAX_PATH] = { 0 };
wchar_t* lpBuffer;
for (int i = 0; i < (cbTranslate / sizeof(struct LANGANDCODEPAGE)); i++)
{
StringCchPrintf(strSubBlock,50,
L"\\StringFileInfo\\%04x%04x\\FileDescription",
lpTranslate[i].wLanguage,
lpTranslate[i].wCodePage);
VerQueryValue(lpData,
strSubBlock,
(void**)&lpBuffer,
&dwBytes);
std::wcout << lpBuffer << std::endl;
}
}
if(lpData) free(lpData);
if (handle) CloseHandle(handle);
return 0;
}
它对我有用:
推荐阅读
- linux - apache linux中的ldap身份验证
- powerbi - 使用 Spark odbc 连接器从 Azure 数据工厂连接到 Databricks 表时出现问题
- amazon-web-services - AWS 上的串行 COM 端口
- excel - SumIF 使用表/命名范围而不是单个单元格条件
- vba - Outlook.Mailitem 未能被另一个子调用
- android - 当我使用带有位图或可绘制位图的滑动时,应用程序在添加第 4 个连续图像时不断崩溃
- javascript - SPA 调用 CORS 禁用的 api
- xsl-fo - axf:font-face 标签中同族的多种字体
- gherkin - 是否可以在“给定,何时,然后”之后添加“其他”?
- python-3.x - 如何在openCV中分割颜色通道而不返回灰度图像?我尝试了以下它返回灰度图像