通过进程ID查询进程是否还在运行. function IsProcessAlive(ProcessID: DWORD): Boolean; const { Vista 及以后版本的系统需要该参数 } PROCESS_QUERY_LIMITED_INFORMATION = $1000; var hProcess: THandle; dwExitCode: DWORD; begin Result := False; { 获取进程句柄 } hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION, False, ProcessID); if hProcess = 0 then Exit; try { 查询退出代码 } if not GetExitCodeProcess(hProcess, dwExitCode) then Exit; Result := (dwExitCode = STILL_ACTIVE); finally CloseHandle(hProcess); end; end;
function CheckIfRunning():boolean; var ProcessID:array[0 .. 255] of Cardinal; BytesRead:DWORD; N,i:integer; hProcess,hModule:THandle; ProcessName:array[0 .. 255] of char; S:string; begin Result:=false; if EnumProcesses(PDWORD(@ProcessID[0]),SizeOf(ProcessID),BytesRead) then begin N:=BytesRead div SizeOf(Cardinal); for i:=0 to N-1 do begin hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or PROCESS_TERMINATE,false,ProcessID[i]); if EnumProcessModules(hProcess,PDWORD(@hModule),SizeOf(hModule),BytesRead) then begin GetModuleBaseName(hProcess,hModule,@ProcessName[0],SizeOf(ProcessName)); S:=PChar(@ProcessName[0]); if UpperCase(S)='lala.exe' then begin if MessageDlg('close lala.exe?',mtInformation,[mbYes,mbNo],0)=idYes then TerminateProcess(hProcess,0); end; end; CloseHandle(hProcess); end; Result:=true; end; end;
function IsProcessAlive(ProcessID: DWORD): Boolean;
const
{ Vista 及以后版本的系统需要该参数 }
PROCESS_QUERY_LIMITED_INFORMATION = $1000;
var
hProcess: THandle;
dwExitCode: DWORD;
begin
Result := False;
{ 获取进程句柄 }
hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION, False, ProcessID);
if hProcess = 0 then Exit;
try
{ 查询退出代码 }
if not GetExitCodeProcess(hProcess, dwExitCode) then Exit;
Result := (dwExitCode = STILL_ACTIVE);
finally
CloseHandle(hProcess);
end;
end;
并不是每个进程都有窗口。
可以用EnumThreadWindows枚举
那么OpenProcess即可知道
var
ProcessID:array[0 .. 255] of Cardinal;
BytesRead:DWORD;
N,i:integer;
hProcess,hModule:THandle;
ProcessName:array[0 .. 255] of char;
S:string;
begin
Result:=false;
if EnumProcesses(PDWORD(@ProcessID[0]),SizeOf(ProcessID),BytesRead) then
begin
N:=BytesRead div SizeOf(Cardinal);
for i:=0 to N-1 do begin
hProcess:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or PROCESS_TERMINATE,false,ProcessID[i]);
if EnumProcessModules(hProcess,PDWORD(@hModule),SizeOf(hModule),BytesRead) then begin
GetModuleBaseName(hProcess,hModule,@ProcessName[0],SizeOf(ProcessName));
S:=PChar(@ProcessName[0]);
if UpperCase(S)='lala.exe' then begin
if MessageDlg('close lala.exe?',mtInformation,[mbYes,mbNo],0)=idYes then TerminateProcess(hProcess,0);
end;
end;
CloseHandle(hProcess);
end;
Result:=true;
end;
end;