代码之家  ›  专栏  ›  技术社区  ›  Byron Whitlock

如何查看另一个进程是否正在Windows上运行?

  •  4
  • Byron Whitlock  · 技术社区  · 16 年前

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Reed Copsey    16 年前

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

    您需要使用openprocess来获取一个进程句柄,然后 QueryFullProcessImageName 以获取进程的可执行文件。

        2
  •  4
  •   Brian R. Bondy    16 年前

    使用 CreateToolhelp32Snapshot 功能

    hSnapShot = FCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    

    然后 Process32First Process32Next .

    你会得到一个 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成员可能足够满足您的需要。