【问题标题】:How do I see if another process is running on windows?如何查看 Windows 上是否正在运行另一个进程?
【发布时间】:2009-07-29 18:03:15
【问题描述】:

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

【问题讨论】:

标签: c++ windows winapi


【解决方案1】:

使用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 成员可能足以满足您的需要。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 2015-05-28
      • 2011-12-08
      • 1970-01-01
      • 2015-01-09
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      相关资源
      最近更新 更多