Check whether one specific process is running on windows with C++

前端 未结 3 1996
终归单人心
终归单人心 2020-12-11 21:02

Is there any function in psapi or windows.h to get desired process\' is running via only the process name (e.g : \"chrome.exe\") without getting all processes.

Edit

相关标签:
3条回答
  • 2020-12-11 21:39

    You can use CreateToolhelp32Snapshot as given above. If you need to regularly poll for the process, save the process ID once you've found it running and then check using OpenProcess. This is many times faster, but be aware that the OS recycles PIDs, so you'll have to deal with that.

    If you know something about the internals of the process (or even have control over it) there are other options such as checking for:

    • the existence of a named memory object (using CreateFileMapping)
    • the existence of a named mutex (using OpenMutex)

    More details are given in the answer to this question: Fast way to check for a specific process running

    0 讨论(0)
  • 2020-12-11 21:49

    the above answer works on win 8. here it is without the wstring stuff and stripping off the path

    #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;
    }
    
    0 讨论(0)
  • 2020-12-11 21:54
    #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;
    }
    
    0 讨论(0)
提交回复
热议问题