c + + - Scan efter processer og gør noget, når et specifikt er fundet

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil have mit C ++-program til at scanne efter processer, og når en bestemt file.exe kører, vil jeg have mit program til at gøre noget (irrelevant her). Kan du hjælpe mig med denne opgave?


Jeg fandt noget på internettet. Er dette ok ?


CreateMutex(NULL, FALSE, NAMEofTHEprocess\_exe);
if (GetLastError() == ERROR\_ALREADY\_EXISTS)return 0;


Kan jeg bruge det i mit program? Jeg ved ikke, hvad Mutex er.

Bedste reference


Her er en grundlæggende opregning af kørende processer i Windows:


#define  WINVER      0x0500
#define \_WIN32\_WINNT 0x0500
#define  PSAPI\_VERSION    1
#include <windows.h>
#include <tchar.h>
#include <psapi.h>
#include <sddl.h>

void ListProcesses()
{
  DWORD aProcesses[1024], cbNeeded, cProcesses;
  MEMORYSTATUSEX statex;

  statex.dwLength = sizeof(statex);

  ::GlobalMemoryStatusEx(&statex);

  ::EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded);
  cProcesses = cbNeeded / sizeof(DWORD);

  for (size\_t i = 0; i < cProcesses; ++i)
    if(aProcesses[i] != 0)
      std::cout << "PID: " << aProcesses[i] << ", Name: " << getProcessNameByID(aProcesses[i]) << std::endl;
}


Du kan bruge det endelige navneopslag med getProcessNameByID for at træffe en beslutning. Her er koden til getProcessPathNameByID:


#include <tchar.h>

std::string getProcessNameByHandle(HANDLE hProcess)
{
  if (NULL == hProcess)
    return "<unknown>";

  TCHAR szProcessName[MAX\_PATH] = TEXT("<unknown>");
  HMODULE hMod;
  DWORD cbNeeded;

  if (::EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded))
    ::GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR));

  return std::string(szProcessName);
}

std::string getProcessNameByID(DWORD processID)
{
  HANDLE      hProcess = ::OpenProcess(PROCESS\_QUERY\_INFORMATION | PROCESS\_VM\_READ, FALSE, processID);
  std::string result   = getProcessNameByHandle(hProcess);
  ::CloseHandle(hProcess);

  return result;
}