您的位置:首页 > 其它

一个比较方便的关闭进程函数

2014-05-06 17:31 337 查看
原创哦...如果有更好的功能或者BUG修订请通知我, 谢谢

uses
TlHelp32, PsAPI;

{AFile: 要结束的进程
AEffectFirst: 是否只结束第一个找到的进程

可以只输入EXE名称, 或者全路径+文件名, 或者只是某个文件路径
如果输入的只是某个路径, 则关闭属于这个路径下的所有进程}
function KillProcess(AFile: string; AEffectFirst: Boolean = True): WORD;
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;
nDA: DWORD;
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);

{想运行到XP上需要指定这个值, 因为在高版本Delphi上这个值最后会变成$FFFF
导致编译的程序在XP系统上获取句柄失败}
nDA := STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $FFF;
nPrHandle := OpenProcess(nDA, False, nProcessEntry32.th32ProcessID);
try
if nCMode <> 1 then
begin
nPath := ExtractFilePath(nStr);
if nPath = '' then
begin
{此处据说在64位系统上会执行失败, win10-X64未发现
替代方案是, 如果是vista以上的版本使用QueryFullProcessImageName替代
KERNEL32.dll QueryFullProcessImageName}
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐