首页 > 代码库 > 一个比较方便的关闭进程函数
一个比较方便的关闭进程函数
原创哦...如果有更好的功能或者BUG修订请通知我, 谢谢
uses TLHelp32, PsAPI; {AFile: 要结束的进程 AEffectFirst: 是否只结束第一个找到的进程 可以只输入EXE名称, 或者全路径+文件名, 或者只是某个文件路径 如果输入的只是某个路径, 则关闭属于这个路径下的所有进程} function KillProcess(AFile: string; AEffectFirst: Boolean = True): WORD; overload; const PROCESS_TERMINATE = $0001; var nContinueLoop: BOOL; nSnapShotHandle: THandle; nProcessEntry32: TProcessEntry32; nSelfID, nPrHandle: Cardinal; nMBF: array [0..MAX_PATH] of Char; nCMode: Byte; {0:检测全路径文件, 1:仅检测文件 2:仅检测路径} nCPath, nCFile, nStr, nFile, nPath: string; begin Result := 0; AFile := UpperCase(AFile); nCPath := ExtractFilePath(AFile); nCFile := ExtractFileName(AFile); if (nPath <> ‘‘) and (nCFile <> ‘‘) then nCMode := 0 else if nCFile <> ‘‘ then nCMode := 1 else if nCPath <> ‘‘ then nCMode := 2 else Exit; nSelfID := GetCurrentProcessID; nSnapShotHandle := CreateToolhelp32SnapShot(TH32CS_SNAPPROCESS, 0); try nProcessEntry32.dwSize := SizeOf(nProcessEntry32); nContinueLoop := Process32First(nSnapShotHandle, nProcessEntry32); while nContinueLoop do begin if nProcessEntry32.th32ProcessID <> nSelfID then begin nStr := UpperCase(nProcessEntry32.szExeFile); nFile := ExtractFileName(nStr); nPrHandle := OpenProcess(PROCESS_ALL_ACCESS, False, nProcessEntry32.th32ProcessID); try if nCMode <> 1 then begin nPath := ExtractFilePath(nStr); if nPath = ‘‘ then begin if GetModuleFileNameEx(nPrHandle, 0, @nMBF[0], SizeOf(nMBF)) > 0 then nPath := UpperCase(ExtractFilePath(nMBF)); end; end; if ((nCMode = 0) and (nPath = nCPath) and (nFile = nCFile)) {全路径文件名相同} or ((nCMode = 1) and (nFile = nCFile)) {文件名相同} or ((nCMode = 2) and (Copy(nPath, 1, Length(nCPath)) = nCPath)) {路径包含} then begin TerminateProcess(nPrHandle, 0); {强制关闭进程} if AEffectFirst then Break; end; finally CloseHandle(nPrHandle); end; end; nContinueLoop := Process32Next(nSnapShotHandle, nProcessEntry32); end; finally CloseHandle(nSnapShotHandle); end; end;
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。