其实如果知道进程ID之后就可以结束这个进程了,方法如下:
其中dwID为PID
HANDLE hHandle = NULL;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
::TerminateProcess(hHandle, 0);
::WaitForSingleObject(hHandle, INFINITE);
::CloseHandle(hHandle);
其中dwID为PID
HANDLE hHandle = NULL;
hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwID);
::TerminateProcess(hHandle, 0);
::WaitForSingleObject(hHandle, INFINITE);
::CloseHandle(hHandle);
SetWindowText(hwnd, TEXT("")); // Clear the output box CToolhelp th(TH32CS_SNAPALL, dwProcessID); // Show Process details
PROCESSENTRY32 pe = { sizeof(pe) };
BOOL fOk = th.ProcessFirst(&pe);
for (; fOk; fOk = th.ProcessNext(&pe)) {
if (pe.th32ProcessID == dwProcessID) {
AddText(hwnd, TEXT("Filename: %s\r\n"), pe.szExeFile);
AddText(hwnd, TEXT(" PID=%08X, ParentPID=%08X, ")
TEXT("PriorityClass=%d, Threads=%d, Heaps=%d\r\n"),
pe.th32ProcessID, pe.th32ParentProcessID,
pe.pcPriClassBase, pe.cntThreads,
th.HowManyHeaps());
break; // No need to continue looping
}
}
// Show Modules in the Process
// Number of characters to display an address
const int cchAddress = sizeof(PVOID) * 2;
AddText(hwnd, TEXT("\r\nModules Information:\r\n")
TEXT(" Usage %-*s(%-*s) %8s Module\r\n"),
cchAddress, TEXT("BaseAddr"),
cchAddress, TEXT("ImagAddr"), TEXT("Size")); MODULEENTRY32 me = { sizeof(me) };
fOk = th.ModuleFirst(&me);
for (; fOk; fOk = th.ModuleNext(&me)) {
if (me.ProccntUsage == 65535) {
// Module was implicitly loaded and cannot be unloaded
AddText(hwnd, TEXT(" Fixed"));
} else {
AddText(hwnd, TEXT(" %5d"), me.ProccntUsage);
}
PVOID pvPreferredBaseAddr =
GetModulePreferredBaseAddr(pe.th32ProcessID, me.modBaseAddr);
if (me.modBaseAddr == pvPreferredBaseAddr) {
AddText(hwnd, TEXT(" %p %*s %8u %s\r\n"),
me.modBaseAddr, cchAddress, TEXT(""),
me.modBaseSize, me.szExePath);
} else {
AddText(hwnd, TEXT(" %p(%p) %8u %s\r\n"),
me.modBaseAddr, pvPreferredBaseAddr, me.modBaseSize, me.szExePath);
}
}
// Show threads in the process
AddText(hwnd, TEXT("\r\nThread Information:\r\n")
TEXT(" TID Priority\r\n"));
THREADENTRY32 te = { sizeof(te) };
fOk = th.ThreadFirst(&te);
for (; fOk; fOk = th.ThreadNext(&te)) {
if (te.th32OwnerProcessID == dwProcessID) {
int nPriority = te.tpBasePri + te.tpDeltaPri;
if ((te.tpBasePri < 16) && (nPriority > 15)) nPriority = 15;
if ((te.tpBasePri > 15) && (nPriority > 31)) nPriority = 31;
if ((te.tpBasePri < 16) && (nPriority < 1)) nPriority = 1;
if ((te.tpBasePri > 15) && (nPriority < 16)) nPriority = 16;
AddText(hwnd, TEXT(" %08X %2d\r\n"),
te.th32ThreadID, nPriority);
}
}
var
FSnapshotHandle:THandle;//快照句柄
FProcessEntry32:TProcessEntry32;//快照进程结构
Ret : BOOL;//进程队列检测结束标志
ProcessID : integer; //进程ID
ProcessHndle : THandle; //进程句柄
s:string;
begin
if FSnapshotHandle > 0 then CloseHandle(FSnapshotHandle);//检测快照句柄
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);//创建系统快照
FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);//先初始化 FProcessEntry32 的大小
Ret:=Process32First(FSnapshotHandle,FProcessEntry32);//是否进程列表结束
while Ret do
begin
s:=ExtractFileName(FProcessEntry32.szExeFile);//取应用的名称
if uppercase(s)=uppercase(AppString) then //比较应用名称
begin
ProcessID:=FProcessEntry32.th32ProcessID;//取需要应用进程的ID
s:='';
break;
end;
Ret:=Process32Next(FSnapshotHandle,FProcessEntry32);
end; //循环枚举出系统开启的所有进程,找出“AppString”
ProcessHndle:=OpenProcess(PROCESS_ALL_ACCESS,false,ProcessID);//按照进程ID查找句柄
TerminateProcess(ProcessHndle,0);//终断进程
CloseHandle(FSnapshotHandle);//关闭快照句柄变量
CloseHandle(ProcessHndle);//关闭句柄变量
end;