C++ 计算相同运行进程的总数

dro*_*ath 4 c++ windows winapi process

我正在寻找一种方法来检测具有相同进程名称的正在运行的进程的数量。

例如,我运行记事本三遍。

记事本.exe 记事本.exe 记事本.exe

所以它会返回3。

我目前有这些代码来检测正在运行的进程,但不计算其正在运行的进程数量。

#include <iostream>
#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>

bool IsProcessRunning(const char *进程名称);

int main()
{
  char *notepadRunning = (IsProcessRunning("notepad.exe")) ?“是”:“否”;
  std::cout << "记事本正在运行吗?" << notepadRunning;
  返回0;
}

bool IsProcessRunning(const char *进程名称)
{
   PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) };
   HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPPROCESS, 0);

   if(Process32First(hSnapshot, &pe32))
   {
      做
      {
         if(_tcsicmp(pe32.szExeFile, 进程名) == 0)
         {
            关闭句柄(hSnapshot);
            返回真;
         }
      while(Process32Next(hSnapshot, &pe32));
   }

   关闭句柄(hSnapshot);
   返回假;
}

任何形式的帮助将不胜感激:)

谢谢。

Bri*_*ndy 5

您使用的是正确的 API,即CreateToolhelp32SnapshotProcess32FirstProcess32Next。正如您所做的那样,您应该使用 struct PROCESSENTRY32中的 szExeFile 成员。

当您当前找到匹配项时,您将从函数中返回。相反,您应该增加计数器而不返回。并返回一个包含进程计数的 int,而不是 bool。另外请确保不要执行 CloseHandle(hSnapshot); 操作 直到获得计数后函数结束。

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

要获得特权以便获得所有会话:

acquirePrivilegeByName(SE_DEBUG_NAME);// SeDebugPrivilege
Run Code Online (Sandbox Code Playgroud)

其中 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()
Run Code Online (Sandbox Code Playgroud)