如何查看Windows上是否还有其他进程正在运行?

时间:2009-07-29 18:03:15

标签: c++ windows winapi

我有一个VC ++控制台应用程序,我需要检查另一个进程是否正在运行。我没有窗口标题,我只有可执行文件名称。如何获取进程句柄/ PID?我可以枚举使用此.exe运行的进程吗?

2 个答案:

答案 0 :(得分:4)

使用CreateToolhelp32Snapshot功能

hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

后跟Process32FirstProcess32Next

您将获得一个PROCESSENTRY32结构,其中包含一个szExeFile成员。

PROCESSENTRY32W    processInfo;
processInfo.szExeFile

确保在枚举之前首先获得权限SeDebugPrivilege,这样您将获得所有会话和用户的所有进程。

获取权限以便获得所有会话:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege

其中acquirePrivilegeByName定义为:

BOOL acquirePrivilegeByName(
                            const TCHAR     *szPrivilegeName)
{
    HANDLE          htoken;
    TOKEN_PRIVILEGES    tkp;
    DWORD           dwerr;

    //---------------- adjust process token privileges to grant privilege
    if (szPrivilegeName == NULL)
    {
        SetLastError(ERROR_INVALID_PARAMETER);
        return FALSE;
    }

    if (!LookupPrivilegeValue(NULL, szPrivilegeName, &(tkp.Privileges[0].Luid)))
        return FALSE;

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &htoken))
        return FALSE;

    if (!AdjustTokenPrivileges(htoken, FALSE, &tkp, 0, NULL, NULL) ||
        GetLastError() != ERROR_SUCCESS)    // may equal ERROR_NOT_ALL_ASSIGNED
    {
        dwerr = GetLastError();
        CloseHandle(htoken);
        SetLastError(dwerr);
        return FALSE;
    }

    CloseHandle(htoken);
    SetLastError(ERROR_SUCCESS);

    return TRUE;
} //acquirePrivilegeByName()

如果您需要完整的过程映像名称,可以使用QueryFullProcessImageName,但szExeFile成员可能足以满足您的需求。

答案 1 :(得分:2)

您可以使用EnumProcesses枚举系统上的进程。

您需要使用OpenProcess来获取流程句柄,然后使用QueryFullProcessImageName来获取流程的可执行文件。