首页 > 解决方案 > 如何通过 Win32 API 获取人类可读的进程名称(如在任务管理器中)?

问题描述

我尝试检测当前活动窗口的进程名称。我有以下代码。

#include <iostream>
#include <functional>
#include <thread>
#include <windows.h>
#include <Psapi.h>

using namespace std;

int main()
{
    while (true) {
        wchar_t buffer[512];
        HWND hwnd = GetForegroundWindow(); // get handle of currently active window
        DWORD processId;
        GetWindowThreadProcessId(hwnd, &processId);
        auto processHandle = OpenProcess(PROCESS_VM_READ | PROCESS_QUERY_INFORMATION, false, processId);

        DWORD length = sizeof(buffer) / sizeof(buffer[0]);
        auto success = QueryFullProcessImageNameW(processHandle, 0, buffer, &length);

        if (success) {
            wcout << endl << buffer << endl;
        }
        else {
            wcout << endl << L"An error has occurred. Code: " << GetLastError() << endl;
        }

        std::this_thread::sleep_for(std::chrono::milliseconds(1000));
    }
}

它运行良好,但目前可执行文件的路径已打印到控制台中,例如

C:\Program Files (x86)\Opera\68.0.3618.63\opera.exe

但我想获得一个人类可读的进程名称,就像在 Windows 任务管理器中一样,即:

Opera Internet Browser

此外,当我选择任务管理器的窗口时,当前代码只会打印一个错误代码:

An error has occurred. Code: 6

因此,如何通过 WinAPI 在任务管理器中获取进程名称?

标签: c++winapi

解决方案


推荐阅读