在網上搜了一下delphi結束進程的代碼,發現當要結束的進程名是當前的進程並且該程式開了多個的話,會因為當前進程在結束其他進程前把自己關掉而不能結束所有同名的進程,所以修改了一下:
註:TProcessEntry32 需要引用單元 uses TLHelp32;
function killProcess(iProcessName:string):boolean;
var
HandleSnap:THandle;//用於獲得進程列表
killHandle:THandle;
processEntry:TProcessEntry32;//用於尋找進程
found:boolean;
count:integer;
selfProcessID:cardinal;
begin
HandleSnap:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);//獲得系統進程列表
processEntry.dwSize:=sizeof(TProcessEntry32);/在調用Process32First API之前,需要初始化lppe記錄的大小
selfProcessID:=getCurrentProcessID();//獲得當前Delphi應用程式的進程ID
count:=0;
found:=process32First(HandleSnap,processEntry);//將進程列表的第一個進程資訊讀入記錄中
while(found)do
begin
if((uppercase(extractFileName(processEntry.szExeFile))=upperCase(iProcessName))
or(uppercase(processEntry.szExeFile)=upperCase(iProcessName)))then
begin
if(processEntry.th32ProcessID<>selfProcessID)then//如果進程是當前進程,則不結束
begin
killHandle:=OpenProcess(PROCESS_TERMINATE, False, processEntry.th32ProcessID);
TerminateProcess(killHandle,0);
end;
inc(count);
end;
found:=process32Next(HandleSnap,processEntry);//將進程列表的下一個進程資訊讀入記錄中
end;
closeHandle(handleSnap);
//搜尋完所有進程後,如果要結束的進程名與當前應用程式的名字一樣,則結束當前進程
if(uppercase(iProcessName)=uppercase(extractFileName(application.ExeName)))then
begin
killHandle:=OpenProcess(PROCESS_TERMINATE, False, selfProcessID);
TerminateProcess(killHandle,0);
end;
end;