如何使用C ++检查进程是否正在运行

时间:2012-05-17 14:49:47

标签: c++ winapi visual-c++

如果一个进程没有运行,我不应该显示某些上下文菜单选项? 我正在使用进程名称检查进程是否正在运行。

但问题是,进程名称在不同的Windows平台上显示不同的方式。

即,Windows任务栏上的Windows 64位进程名称为“ applicationname.exe

某些windows xp机器显示与“ applica~2.exe ”相同的进程名称

请让我知道检查流程是否正在运行的一致方法?

我的开发环境是C ++和Visual Studio 2010

   DWORD getProcessID(const std::wstring& processName)
   {
       PROCESSENTRY32 info;
       info.dwSize = sizeof(info);

       HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
       if ( snapshot == INVALID_HANDLE_VALUE )
             return 0;

       Process32First(snapshot, &info);
       if ( !processName.compare(info.szExeFile) )
       {
             CloseHandle(snapshot);
             return info.th32ProcessID;
       }

       while ( Process32Next(snapshot, &info) )
       {
              if ( !processName.compare(info.szExeFile) )
               {
                    CloseHandle(snapshot);
                    return info.th32ProcessID;
               }
       }

      CloseHandle(snapshot);
     return 0;
   }

3 个答案:

答案 0 :(得分:1)

EnumProcesses是枚举活动进程的另一种方法。

不同之处在于您需要为PID分配空间,调用EnumProcesses,使用PROCESS_QUERY_INFORMATION访问标志打开每个进程,然后在其句柄上调用GetProcessImageFileName并进行比较。

答案 1 :(得分:0)

您是相关流程的作者吗?如果是这样,更稳健的设计将是使用IPC直接询问过程。这样,您不一定要进行民意调查,也不会遇到令人恼火的问题,例如,如果您检测到流程,创建上下文菜单然后流程会中断,会发生什么?

答案 2 :(得分:0)

使用WMI查询Win32_Process的实例,可以检查正在运行的进程的完整路径,以查找您需要查看的进程的匹配。