2011-10-31 18 views
22

Básicamente, tengo un programa que se lanzará más de una vez. Entonces, habrá dos o más procesos lanzados del programa.¿Cómo matar procesos por nombre? (Win32 API)

Quiero utilizar la API Win32 y matar/terminar todos los procesos con un nombre específico.

He visto ejemplos de matar a un proceso, pero no procesos múltiples con exactamente el mismo nombre (pero diferentes parámetros).

+1

¿Por qué no haces lo que haces para matar un solo proceso iterativamente, hasta que fallas? (no más procesos para matar) –

+0

Terminar un proceso es una operación peligrosa. ¿Por qué es necesario que elimines estos procesos? ¿Se puede hacer con mayor gracia (por ejemplo, enviando a todas las ventanas un mensaje 'WM_CLOSE')? –

+0

Es una aplicación de consola ... bueno, una aplicación de Python CONVERTED con py2exe a .exe y creo que la única forma es terminarlo con fuerza – dikidera

Respuesta

38

Try a continuación código, killProcessByName() matará a cualquier proceso con el nombre filename:

#include <windows.h> 
#include <process.h> 
#include <Tlhelp32.h> 
#include <winbase.h> 
#include <string.h> 
void killProcessByName(const char *filename) 
{ 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL); 
    PROCESSENTRY32 pEntry; 
    pEntry.dwSize = sizeof (pEntry); 
    BOOL hRes = Process32First(hSnapShot, &pEntry); 
    while (hRes) 
    { 
     if (strcmp(pEntry.szExeFile, filename) == 0) 
     { 
      HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, 0, 
              (DWORD) pEntry.th32ProcessID); 
      if (hProcess != NULL) 
      { 
       TerminateProcess(hProcess, 9); 
       CloseHandle(hProcess); 
      } 
     } 
     hRes = Process32Next(hSnapShot, &pEntry); 
    } 
    CloseHandle(hSnapShot); 
} 
int main() 
{ 
    killProcessByName("notepad++.exe"); 
    return 0; 
} 

Nota: El código es sensible a mayúsculas a filename, se puede editar para el caso insensible.

+0

¿Cómo haré que este programa no sea sensible? – HereToLearn

+1

Puede usar otra función de comparación en lugar de 'strcmp'. Siga [this] (http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – deepmax

+1

'if (hProcess! = NULL && pEntry.th32ProcessID! = GetCurrentProcessId())' para evitar matando a ti mismo! ;-) – poukill

2

Acabo de encontrarme con un problema similar. Esto es lo que se me ocurrió ...

void myClass::killProcess() 
{ 
    const int maxProcIds = 1024; 
    DWORD procList[maxProcIds]; 
    DWORD procCount; 
    char* exeName = "ExeName.exe"; 
    char processName[MAX_PATH]; 

    // get the process by name 
    if (!EnumProcesses(procList, sizeof(procList), &procCount)) 
     return; 

    // convert from bytes to processes 
    procCount = procCount/sizeof(DWORD); 

    // loop through all processes 
    for (DWORD procIdx=0; procIdx<procCount; procIdx++) 
    { 
     // get a handle to the process 
     HANDLE procHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procList[procIdx]); 
     // get the process name 
     GetProcessImageFileName(procHandle, processName, sizeof(processName)); 
     // terminate all pocesses that contain the name 
     if (strstr(processName, exeName)) 
     TerminateProcess(procHandle, 0); 
     CloseHandle(procHandle);  
    } 
} 
Cuestiones relacionadas