获取完整的运行进程列表(Visual C ++)

时间:2010-08-13 13:11:22

标签: winapi visual-c++ process

我目前正在使用EnumProcesses函数来获取正在运行的进程列表。但是,由于我的应用程序在用户空间中运行,因此无法获取未在用户下运行的进程(包括系统进程)的句柄。还有其他方法可以让我访问这些吗?我只需要进程名称。

4 个答案:

答案 0 :(得分:11)

我终于找到了一个解决方案(这是我最后一次绝望的尝试后发布的数据)。如果其他人只需要在系统上运行的进程名称列表(所有进程),这将为您完成。

Process Walking

答案 1 :(得分:10)

只是为了补充这个答案,我建议在你只寻找一个特定的过程而不是整个列表的情况下。

bool FindRunningProcess(AnsiString process) {
/*
Function takes in a string value for the process it is looking for like ST3Monitor.exe
then loops through all of the processes that are currently running on windows.
If the process is found it is running, therefore the function returns true.
*/
    AnsiString compare;
    bool procRunning = false;

    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        procRunning = false;
    } else {
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hProcessSnap, &pe32)) { // Gets first running process
            if (pe32.szExeFile == process) {
                procRunning = true;
            } else {
                // loop through all running processes looking for process
                while (Process32Next(hProcessSnap, &pe32)) { 
                    // Set to an AnsiString instead of Char[] to make compare easier
                    compare = pe32.szExeFile;
                    if (compare == process) {
                        // if found process is running, set to true and break from loop
                        procRunning = true;
                        break;
                    }
                }
            }
            // clean the snapshot object
            CloseHandle(hProcessSnap);
        }
    }

    return procRunning;
}

我应该注意这里是用Embarcadero RAD Studio(C ++ Builder)编写的,每个@Remy_Lebeau System :: AnsiString是一个C ++ Builder字符串类,用于VCL / FMX框架中的8bit ANSI字符数据。

答案 2 :(得分:4)

如果您只需要进程名称,那么请使用WTSEnumerateProcesses

WTS_PROCESS_INFO* pWPIs = NULL;
DWORD dwProcCount = 0;
if(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWPIs, &dwProcCount))
{
    //Go through all processes retrieved
    for(DWORD i = 0; i < dwProcCount; i++)
    {
        //pWPIs[i].pProcessName = process file name only, no path!
        //pWPIs[i].ProcessId = process ID
        //pWPIs[i].SessionId = session ID, if you need to limit it to the logged in user processes
        //pWPIs[i].pUserSid = user SID that started the process
    }
}

//Free memory
if(pWPIs)
{
    WTSFreeMemory(pWPIs);
    pWPIs = NULL;
}

使用此方法的好处是,您不必单独打开每个流程,然后检索其名称,如果您选择使用EnumProcesses,则必须执行此操作。如果您尝试打开以高于您的用户帐户的权限运行的进程,也会失败。

此外,此方法也比在循环中调用Process32First() / Process32Next()快得多。

WTSEnumerateProcesses是一个鲜为人知的API,自Windows XP以来一直可用。

答案 3 :(得分:0)

WMI查询(很可能使用WMI的COM接口,但您需要翻译VB(脚本)重点文档)可能会有所帮助。 Win32_Process类包含您需要的内容。

但是,我没有对此进行测试,我认为您会发现同样的问题:非管理员只能看到自己的流程。