プロセス名を使用してプロセスidとプロセスハンドルを取得する


  • 関連apiの紹介
  • CreateToolhelp32Snapshot
  • Process32First
  • Process32Next

  • プロセス名取得プロセスidコードによる
  • を実現する.
    この文書では、タスクマネージャを作成するために必要なAPIの説明と、プロセス名でプロセスidを取得する方法について説明します.関数の使用頻度が高いので、多重化のために貼り付けます.

    関連apiの紹介


    CreateToolhelp32Snapshot


    関数機能は、現在のすべてのプロセスを撮影するスナップショットです.関数のプロトタイプは次のとおりです.
    HANDLE WINAPI CreateToolhelp32Snapshot(
      _In_ DWORD dwFlags,//    “  ”        ,   TH32CS_SNAPPROCESS 
      _In_ DWORD th32ProcessID//    ID ,               ,                        0
    );

    具体的なパラメータのリストは、以下のようになります.dwFlags:スナップショットに含まれるシステムの内容を指定します.このパラメータは、次の数値(定数)の1つ以上を使用できます.
  • TH32CS_INHERIT-スナップショットハンドルが継承可能であることを宣言します.
  • TH32CS_SNAPALL-スナップショットにシステム内のすべてのプロセスとスレッドが含まれます.
  • TH32CS_SNAPHEAPLIST-th 32 ProcessIDで指定されたプロセスのすべてのスタックをスナップショットに含めます.
  • TH32CS_SNAPMODULE-th 32 ProcessIDで指定されたプロセスのすべてのモジュールをスナップショットに含めます.
  • TH32CS_SNAPPROCESS-スナップショットにシステム内のすべてのプロセスが含まれます.
  • TH32CS_SNAPTHREAD-スナップショットにシステム内のすべてのスレッドが含まれます.
  • Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST | TH32CS_SNAPPROCESS | TH32CS_SNAPTHREAD | - TH32CS_SNAPMODULE)

  • th 32 ProcessID:スナップショットするプロセスIDを指定します.このパラメータが0の場合、スナップショットの現在のプロセスが表示されます.このパラメータはTH 32 CS_が設定されている場合のみSNAPHEAPLISTまたはTH 32 CS_SNAPMODULEが有効になった後、他の場合はこのパラメータは無視され、すべてのプロセスがスナップショットされます.

    Process32First


    プロセス32 Firstはプロセス取得関数であり、関数CreateToolhelp 32 Snapshot()を使用して現在の実行プロセスのスナップショットを取得すると、プロセス32 First関数を使用して最初のプロセスのハンドルを得ることができます.関数のプロトタイプは次のとおりです.
    BOOL WINAPI Process32First(
      _In_    HANDLE           hSnapshot,
      _Inout_ LPPROCESSENTRY32 lppe
    );

    hSnapshot:CreateToolhelp 32 Snapshotを使用して取得したスナップショットハンドル.lppe:プロセスの情報を格納するPROSCESSENTRY 32構造ポインタ.最初のプロセスがない場合falseを返します.そうでない場合trueを返します.

    Process32Next


    スナップショットを撮影した後、現在のプロセスの次のプロセスの情報を取得します.関数のプロトタイプは次のとおりです.
    BOOL WINAPI Process32Next(
      _In_  HANDLE           hSnapshot,
      _Out_ LPPROCESSENTRY32 lppe
    );

    hSnapshot:CreateToolhelp 32 Snapshotを使用して取得したスナップショットハンドル.lppe:現在のプロセス情報構造を指すポインタで、呼び出されて次の関数の情報構造体に戻ります.ループが終了するとfalseが戻る、そうでなければtrueが戻る.

    プロセス名によるプロセスidコード取得の実装

    #include
    #include
    #include
    #include
    using namespace std;
    vector GetProcessIDByName(LPCTSTR szProcessName)
    {
        STARTUPINFO st;
        PROCESS_INFORMATION pi;
        PROCESSENTRY32 ps;
        HANDLE hSnapshot;
        vector dwPID;
        ZeroMemory(&st, sizeof(STARTUPINFO));
        ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
        st.cb = sizeof(STARTUPINFO);
        ZeroMemory(&ps, sizeof(PROCESSENTRY32));
        ps.dwSize = sizeof(PROCESSENTRY32);
    
        hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//      
        if (hSnapshot == INVALID_HANDLE_VALUE)//      
        {
            return dwPID;
        }
    
    
        if (!Process32First(hSnapshot, &ps))
        {
            return dwPID;
        }
        do
        {
    
            if (lstrcmpi(ps.szExeFile, szProcessName) == 0)//      ,     
            {
    
    
                dwPID.push_back(ps.th32ProcessID);//   id     
            }
        } while (Process32Next(hSnapshot, &ps));
        //       
        CloseHandle(hSnapshot);
        return dwPID;//    
    }

    関数の使用方法.関数は検索するプロセスの名前を入力し、すべてのプロセスの名前が要求に合致するプロセスのリストを返します.githubへようこそ、完全なコードをダウンロードしてください.どんな質問でもお問い合わせください.githubアドレス