実行中のプロセスの全リストを取得する (Visual C++) 質問する

実行中のプロセスの全リストを取得する (Visual C++) 質問する

現在、EnumProcesses 関数を使用して、実行中のプロセスのリストを取得しています。ただし、アプリケーションはユーザー空間で実行されるため、システム プロセスなど、ユーザーの下で実行されていないプロセスのハンドルを取得できません。これらにアクセスできる別の方法はありますか? 必要なのはプロセス名だけです。

ベストアンサー1

この回答に付け加えると、これは、リスト全体ではなく、特定のプロセスだけを探している場合のために構築したものです。

bool FindRunningProcess(AnsiString process) {
/*
Function takes in a string value for the process it is looking for like ST3Monitor.exe
then loops through all of the processes that are currently running on windows.
If the process is found it is running, therefore the function returns true.
*/
    AnsiString compare;
    bool procRunning = false;

    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == INVALID_HANDLE_VALUE) {
        procRunning = false;
    } else {
        pe32.dwSize = sizeof(PROCESSENTRY32);
        if (Process32First(hProcessSnap, &pe32)) { // Gets first running process
            if (pe32.szExeFile == process) {
                procRunning = true;
            } else {
                // loop through all running processes looking for process
                while (Process32Next(hProcessSnap, &pe32)) { 
                    // Set to an AnsiString instead of Char[] to make compare easier
                    compare = pe32.szExeFile;
                    if (compare == process) {
                        // if found process is running, set to true and break from loop
                        procRunning = true;
                        break;
                    }
                }
            }
            // clean the snapshot object
            CloseHandle(hProcessSnap);
        }
    }

    return procRunning;
}

ここで注意すべき点は、これは Embarcadero RAD Studio (C++ Builder) で記述されており、@Remy_Lebeau によれば、System::AnsiString は、VCL/FMX フレームワーク内の 8 ビット ANSI 文字データ用の C++Builder 文字列クラスであるということです。

おすすめ記事