我想在delphi中检查进程是否暂停。 所以我使用了下面的函数,但函数总是返回true。 我怎样才能检查暂停的过程?
function ProcessExist(exeFileName: string): Boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
Result := False;
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
begin
Result := True;
end;
ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
答案 0 :(得分:4)
该代码不会尝试检查进程是否被暂停。而是检查是否存在具有指定可执行文件名的进程。
我将假设您希望检测的进程暂停形式只是暂停该进程中的所有线程。据我所知,没有记录的方法来实现这一点,我们必须采用无证方法。其中一个描述为here:
获取线程状态信息的基本步骤是 跟随(当然知道进程ID(因此第四个PID)和 线程ID(TID)):
- 调用NtQuerySystemInformation并将SystemInformation设置为SystemProcessInformation(5)
- 迭代SYSTEM_PROCESS_INFORMATION结构数组以找到您感兴趣的PID(ProcessId成员)
- 迭代SYSTEM_THREAD结构数组(详见下文)以找到所需的TID(UniqueThread成员)并检查State和 WaitReason会员;如果线程被挂起,则两者都必须设置为5 除此之外的任何其他价值
醇>对大多数热衷于系统级别的人来说,这可能是显而易见的 编程,一个进程在它的所有线程都被挂起时被暂停 暂停,所以必须检查他们所有的暂停状态。
链接文章包含必要的代码。