2011-10-31 52 views
22

基本上,我有一個程序,將不止一次啓動。所以,將會有兩個或更多的程序啓動。如何按名稱殺死進程? (Win32 API)

我想使用Win32 API並使用特定名稱終止/終止所有進程。

我已經看到殺死一個進程的例子,但沒有多個進程名稱完全相同(但參數不同)。

+1

爲什麼你不做你所做的反覆殺死單個過程,直到你失敗? (不再需要殺死的進程) –

+0

終止進程是一個危險的操作。爲什麼你需要殺死這些進程?它可以更優雅地完成(比如通過發送所有窗口的WM_CLOSE消息)? –

+0

它是一個控制檯應用程序...以及py2exe轉換爲py2exe到.exe,我相信唯一的方法是強制終止 – dikidera

回答

38

嘗試下面的代碼,killProcessByName()將殺死任何進程名稱爲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; 
} 

注:代碼是區分於filename敏感,你可以編輯它不區分大小寫。

+0

我該如何使這個程序不區分大小寫? – HereToLearn

+1

您可以使用另一個比較函數而不是'strcmp'。按照[this](http://stackoverflow.com/questions/5820810/case-insensitive-string-comp-in-c) – deepmax

+1

'if(hProcess!= NULL && pEntry.th32ProcessID!= GetCurrentProcessId())'避免殺死你自己! ;-) – poukill

2

我剛碰到類似的問題。這就是我想出的...

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);  
    } 
}