4

psapi 或 windows.h 中是否有任何函数来获取所需的进程'仅通过进程名称(例如:“chrome.exe”)运行而没有获取所有进程。

编辑:

如果有人需要通过运行所有进程列表来获取所需的进程信息,我可以在此处粘贴我的代码。它适用于 xp 机器并使用 vs 2008 编译。

我也为我的问题找到了解决方案!但是根据msdn,该函数已经通过进程运行并检查没有扩展名的名称。很快它就会搜索“chrome”并返回 chrome.*

这个函数有一个很好的优势,它以列表的形式返回进程,它可能是一个 exe 可能与可能的实例一起运行。缺点是需要 CLR,它的运行速度比 psapi 函数慢,并且它有额外的转换要求,例如 String^ 到 wchar 或 String(我没有测试过)

4

3 回答 3

11

上面的答案适用于win 8。这里没有 wstring 的东西并且剥离了路径

#include <tlhelp32.h>
DWORD FindProcessId(char* processName)
{
    // strip path

    char* p = strrchr(processName, '\\');
    if(p)
        processName = p+1;

    PROCESSENTRY32 processInfo;
    processInfo.dwSize = sizeof(processInfo);

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

    Process32First(processesSnapshot, &processInfo);
    if ( !strcmp(processName, processInfo.szExeFile) )
    {
        CloseHandle(processesSnapshot);
        return processInfo.th32ProcessID;
    }

    while ( Process32Next(processesSnapshot, &processInfo) )
    {
        if ( !strcmp(processName, processInfo.szExeFile) )
        {
          CloseHandle(processesSnapshot);
          return processInfo.th32ProcessID;
        }
    }

    CloseHandle(processesSnapshot);
    return 0;
}
于 2014-07-09T06:36:32.523 回答
2
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

using namespace std;

DWORD FindProcessId(const std::wstring& processName);

int main(int argc, char* argv[])
{

  bool bAnyBrowserIsOpen = false;

  if ( FindProcessId(L"chrome.exe") || FindProcessId(L"firefox.exe") || FindProcessId(L"iexplore.exe"))
  {
     bAnyBrowserIsOpen = true;
  }

  return 0;
}


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

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

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

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

  CloseHandle(processesSnapshot);
  return 0;
}
于 2012-12-05T05:40:01.437 回答
1

您可以使用上面给出的 CreateToolhelp32Snapshot。如果您需要定期轮询进程,请在发现进程运行后保存进程 ID,然后使用 OpenProcess 进行检查。这要快很多倍,但请注意操作系统会回收 PID,因此您必须处理它。

如果您对流程的内部有所了解(甚至可以控制它),还有其他选项,例如检查:

  • 命名内存对象的存在(使用 CreateFileMapping)
  • 命名互斥体的存在(使用 OpenMutex)

此问题的答案中提供了更多详细信息:Fast way to check for a specific process running

于 2015-03-24T13:09:53.250 回答