首页 > 解决方案 > C中如何根据hwnd获取进程名

问题描述

编程语言: C

Objective:根据当前hwnd获取进程id和name。

当前代码:

HWND hwnd;
DWORD process_ID;
PWSTR process_name = NULL;

hwnd = GetForegroundWindow();
process_ID = GetWindowThreadProcessId(hwnd,&process_ID)
process_name = ????

我不确定我是否将参数正确传递给函数 GetWindowThreadProcessId。我在 Internet 上发现可以使用 GetModuleFileNameW 来获取进程名称,但我无法理解文档。如果太容易解决,请见谅。我从 C 的世界开始。在此先感谢

标签: cwinapi

解决方案


的返回值GetWindowThreadProcessId()线程ID,而不是进程ID,因此不要将该返回值分配给您的process_ID变量,否则它将覆盖参数输出的值lpdwProcessId

HWND hwnd = GetForegroundWindow();

DWORD process_ID = 0;
if (GetWindowThreadProcessId(hwnd, &process_ID))
{
    // get the process name ...
}
else
{
    // error handling ...
}

获得进程 ID 后,您可以将其传递OpenProcess()HANDLE正在运行的进程,然后将其HANDLEGetModuleFileNameEx()( GetProcessImageFileName()XP+) 或QueryFullProcessImageName()(Vista+) 一起使用以获取该进程的 EXE 文件的完整路径和文件名:

HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_ID);
if (hProcess)
{
    WCHAR process_name[MAX_PATH] = {};
    if (GetModuleFileNameExW(hProcess, NULL, process_name, MAX_PATH))
    {
        // use process_name as needed...
    }
    else
    {
        // error handling ...
    }

    CloseHandle(hProcess);
}
else
{
    // error handling ...
}
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_ID);
if (hProcess)
{
    WCHAR process_name[MAX_PATH] = {};
    if (GetProcessImageFileNameW(hProcess, process_name, MAX_PATH))
    {
        // use process_name as needed...
    }
    else
    {
        // error handling ...
    }

    CloseHandle(hProcess);
}
else
{
    // error handling ...
}
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, process_ID);
if (hProcess)
{
    WCHAR process_name[MAX_PATH] = {};
    DWORD size = MAX_PATH;
    if (QueryFullProcessImageNameW(hProcess, 0, process_name, &size))
    {
        // use process_name as needed...
    }
    else
    {
        // error handling ...
    }

    CloseHandle(hProcess);
}
else
{
    // error handling ...
}

推荐阅读