首页 > 解决方案 > 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++ 代码实现的其他方式。

标签: c++windowspowershellwinapi

解决方案


您可以使用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;
}

它对我有用:

在此处输入图像描述


推荐阅读