获取所有正在运行的进程的名称列表



我想获得所有正在运行的进程的列表,如

example.exe
example2.exe

等等……下面是我试过的代码

WCHAR* GetAllRunningProccess()
{
PROCESSENTRY32 pe32;
HANDLE snap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0
);
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &pe32);
do {
return  pe32.szExeFile;
} while (Process32Next(snap, &pe32));
}
std::wcout << GetAllRunningProccess() << std::endl;

它只打印

[System Process]

你写的代码不像生成器函数一样工作以生成多个值。它只在返回第一个值时退出。你不能从一个函数返回超过一次。

do {
return ...; // This will both exit the loop and exit the function.
} while(...);

尽管协程提供了co_yield来完成此任务。

修复…

最基本的修复将是重新设计你的函数,使其返回字符串的vector,而不仅仅是一个字符串。

std::vector<std::string> GetAllRunningProcesses()
{
PROCESSENTRY32 pe32;
HANDLE snap = CreateToolhelp32Snapshot(
TH32CS_SNAPPROCESS, 0
);
pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(snap, &pe32);
std::vector<std::string> result;
do {
result.push_back(pe32.szExeFile);
} while (Process32Next(snap, &pe32));
CloseHandle(snap);
return result;
}

然后,你可以这样调用它:

for (const auto& processName : GetAllRunningProcesses()) {
std::cout << processName << std::endl;
}

在你的代码中

do {
return  pe32.szExeFile;
} while (Process32Next(snap, &pe32));

我很确定在执行这个while循环之后,一旦编译器返回一个值,然后退出函数并继续执行主体中的代码,而不是回到循环,因此只得到一个输出(一个进程)。

更新你的代码,然后测试。

最新更新