Actualmente estoy usando la función EnumProcesses para obtener una lista de procesos en ejecución. Sin embargo, dado que mi aplicación se ejecuta en espacio de usuario, no puede obtener identificadores para procesos que no se ejecutan bajo el usuario, incluidos los procesos del sistema. ¿Hay algún otro método que me dé acceso a estos? Todo lo que necesito son los nombres de los procesos.Obtener la lista de procesos en ejecución (Visual C++)
Respuesta
Finalmente encontré una solución (cifras después de publicar aquí como mi último intento desesperado). Si alguien más solo necesita una lista de nombres de procesos ejecutándose en el sistema (todos los procesos), esto lo hará por usted.
Una consulta WMI (bastante posible usando la interfaz COM de WMI, pero necesitará traducir la documentación enfocada en VB (Script)) podría ayudar aquí. La clase Win32_Process
contiene lo que necesita.
Sin embargo, no he probado esto, creo que encontrará el mismo problema: un no administrador solo puede ver sus propios procesos.
sólo para añadir a esta respuesta, he construido esto para los casos cuando se busca un solo proceso en particular en lugar de toda la lista.
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;
}
Debo señalar aquí que esto fue escrito en Embarcadero RAD Studio (C++ Builder) y por sistema @Remy_Lebeau :: AnsiString es una clase de cadena de C++ Builder para los datos de caracteres de 8 bits ANSI en sus marcos VCL/FMX.
Si todo lo que necesita son sólo nombres de los procesos, a continuación, utilizar WTSEnumerateProcesses como tal:
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;
}
La ventaja de usar este método es que usted no tiene que abrir cada proceso individual y luego recuperar su nombre como lo que tendría que hacer si fuera con EnumProcesses, que tampoco funcionará si intenta abrir procesos que se ejecutan con privilegios superiores a su cuenta de usuario.
Además, este método también es mucho más rápido que llamar Process32First()
/Process32Next()
en un bucle.
WTSEnumerateProcesses
es una API menos conocida que ha estado disponible desde Windows XP.
- 1. obtener toda la información de procesos en ejecución usando QProcess
- 2. Lista de procesos en ejecución en Windows de 64 bits
- 3. Verificar procesos en ejecución en C
- 4. Obtener una lista de procesos en ejecución y matando a un proceso específico
- 5. Enumerar procesos en ejecución en Delphi
- 6. Recuperar nombres de procesos en ejecución
- 7. ¿Cómo obtener la lista de aplicaciones en ejecución?
- 8. La ejecución de dos procesos en paralelo desde makefile
- 9. ¿La ejecución de procesos python separados evita el GIL?
- 10. Cómo obtener la lista de aplicaciones en ejecución usando PowerShell o VBScript
- 11. ¿Cómo obtener la lista de comandos de Visual Studio?
- 12. C# - Obtener lista de tareas abiertas
- 13. Obtener otros tamaños de ventana de procesos en ejecución en Python
- 14. MySQL - ¿CÓMO MOSTRAR LA LISTA DE PROCESOS solo con los procesos del usuario actual?
- 15. Linux API para mostrar los procesos en ejecución?
- 16. ¿Cómo obtener la lista de tareas programadas y los resultados de la última ejecución en ColdFusion?
- 17. ejecución secuencial de procesos en segundo plano Unix
- 18. obtener la referencia del objeto DTE2 en Visual C# 2010
- 19. Ejecución de dos proyectos a la vez en Visual Studio
- 20. Obtener la lista de miembros de la estructura C
- 21. Cómo detener procesos largos de ejecución con gracia?
- 22. Python: Ejecución de procesos Daemon en Windows 7
- 23. Comunicación entre procesos en c/C++
- 24. La lista de procesos show de Mysql enumera muchos procesos sleep e info = null?
- 25. ¿Cómo muestro los procesos en ejecución en Oracle DB?
- 26. Mostrar la lista de aplicaciones en ejecución del escritorio usando C#
- 27. C# Detección de procesos engendrados
- 28. Transmitir PID de la lista de tareas y eliminar procesos con la lista de tareas
- 29. Vincular bibliotecas con dependencias en Visual C++ sin obtener LNK4006
- 30. ¿Cómo obtener la NSOperation actualmente en ejecución?
Puede estar interesado en esto: http://stackoverflow.com/q/30604485/560648. –
Gracias, debería tener en cuenta que esto fue escrito en Embarcadero RAD Studio (C++ Builder) y por @Remy_Lebeau System :: AnsiString es una clase de cadena C++ Builder para datos de caracteres ANSI de 8 bits en sus marcos VCL/FMX. – Phil
Definitivamente vale la pena agregar ese detalle a su respuesta! Aclamaciones. –