Если вам нужны только имена процессов, используйте WTSEnumerateProcesses как таковой:
WTS_PROCESS_INFO* pWPIs = NULL;
DWORD dwProcCount = 0;
if(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWPIs, &dwProcCount))
{
//Go through all processes retrieved
for(DWORD i = 0; i < dwProcCount; i++)
{
//pWPIs[i].pProcessName = process file name only, no path!
//pWPIs[i].ProcessId = process ID
//pWPIs[i].SessionId = session ID, if you need to limit it to the logged in user processes
//pWPIs[i].pUserSid = user SID that started the process
}
}
//Free memory
if(pWPIs)
{
WTSFreeMemory(pWPIs);
pWPIs = NULL;
}
Преимущество использования этого метода заключается в том, что вам не нужно открывать каждый процесс по отдельности, а затем извлекать его имя как то, что вам нужно сделать, если вы пошли с EnumProcesses , который также выиграл не будет работать, если вы попытаетесь открыть процессы, которые работают с более высокими правами, чем ваша учетная запись пользователя.
Кроме того, этот метод также намного быстрее, чем вызов Process32First()
/ Process32Next()
в цикле.
WTSEnumerateProcesses
- это менее известный API, доступный с Windows XP.