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 に答える