c - 按名称获取 C 中的进程 ID

标签 c windows winapi

我正在尝试通过进程名称(例如,notepad.exe)获取进程 ID,但 Stack Overflow 上的先前解决方案似乎无法正常工作。这是我尝试过的:

DWORD FindProcessId(const char *processname)
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD result = NULL;

    // Take a snapshot of all processes in the system.
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hProcessSnap) return(FALSE);

    // Retrieve information about the first process,
    // and exit if unsuccessful
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);          // Clean the snapshot object
        return(FALSE);
    }

    do
    {
        if (0 == _stricmp(processname, pe32.szExeFile))
        {
            result = pe32.th32ProcessID;
            break;
        }
    } while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    return result;
}

我传入“notepad.exe”并确认它正在我的系统上运行,并且该应用程序正在以具有所需正确权限的管理员身份运行。海拔是这样完成的:

        if (GetModuleFileName(NULL, szPath, ARRAYSIZE(szPath)))
        {
            // Launch itself as administrator.
            sei.lpVerb = TEXT("runas");
            sei.lpFile = szPath;
            sei.hwnd = NULL;
            sei.nShow = SW_NORMAL;

            if (!ShellExecuteEx(&sei))
            {
                MessageBox(NULL, TEXT("The program needs to be elevated to work properly."), APP_TITLE, MB_OK);
                return -1;
            }
        }
        return 0;

它永远找不到进程 ID - 每次都返回 Null。

这是使用 C,而不是 C++。

最佳答案

解决方案是在获取进程快照后简单地设置pe32.dwSize。在此处完成固定代码:

DWORD FindProcessId(const char *processname)
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD result = 0;

    // Take a snapshot of all processes in the system.
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (INVALID_HANDLE_VALUE == hProcessSnap) return(FALSE);

    pe32.dwSize = sizeof(PROCESSENTRY32); // <----- IMPORTANT

    // Retrieve information about the first process,
    // and exit if unsuccessful
    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);          // clean the snapshot object
        printf("!!! Failed to gather information on system processes! \n");
        return(0);
    }

    do
    {
        printf("Checking process %ls\n", pe32.szExeFile);
        if (0 == strcmp(processname, pe32.szExeFile))
        {
            result = pe32.th32ProcessID;
            break;
        }
    } while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    return result;
}

关于c - 按名称获取 C 中的进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20874381/

相关文章:

c++ - 有没有办法确定标准输出是否指向控制台?

c - 对 'gtk_source_buffer_new' 和 'gtk_source_view_new_with_buffer' 错误的 undefined reference

C 2D 字符串数组在其声明的函数之外导致段错误

c - 系统调用与函数调用

c++ - 适用于 Windows 7 的 OpenGL

c++ - 快速捕获调用栈

winapi - 运行一个简单的 shell 命令

c - 当我在我的代码中指定了一个头文件时,为什么我需要在我的 gcc 编译命令中指定一个库?

linux - Windows 和 Linux 下路径名的语法分别是什么?

可以使用 SetWindowLongPtr + GWLP_USERDATA 来存储数据(不是指针)