Delphi 如何获取进程挂起状态?
我想在delphi中检查进程是否已暂停。 所以我使用了下面的函数,但函数总是返回true。 如何检查已暂停的进程Delphi 如何获取进程挂起状态?,delphi,winapi,pascal,lazarus,Delphi,Winapi,Pascal,Lazarus,我想在delphi中检查进程是否已暂停。 所以我使用了下面的函数,但函数总是返回true。 如何检查已暂停的进程 function ProcessExist(exeFileName: string): Boolean; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin FSnapshotHandle := CreateToolhelp32Snapsho
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;
函数ProcessExist(exeFileName:string):布尔值;
变量
连续作业:BOOL;
FSnapshotHandle:THandle;
FProcessEntry32:TProcessEntry32;
开始
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS\u SNAPPROCESS,0);
FProcessEntry32.dwSize:=SizeOf(FProcessEntry32);
ContinueLop:=Process32First(FSnapshotHandle,fpProcessEntry32);
结果:=假;
而整数(ContinueLoop)为0
开始
if((大写(ExtractFileName(FProcessEntry32.szexFile))=
大写(ExeFileName)或(大写(fprocesentry32.szExeFile)=
大写(ExeFileName)))然后
开始
结果:=真;
终止
ContinueLop:=Process32Next(FSnapshotHandle,fpProcessEntry32);
终止
闭合手柄(FSnapshotHandle);
终止
该代码不会尝试检查进程是否挂起。而是检查是否存在具有指定可执行文件名的进程
我将假设您希望检测的进程挂起的形式只是该进程中所有线程的挂起。据我所知,没有文件化的方法来实现这一点,我们必须求助于无文件化的方法。其中一种是:
获取线程状态信息的基本步骤是
遵循(当然知道进程ID(因此是第四个PID)和
线程ID(TID)):
链接文章包含必要的代码。该代码不会尝试检查进程是否挂起。而是检查是否存在具有指定可执行文件名的进程 我将假设您希望检测的进程挂起的形式只是该进程中所有线程的挂起。据我所知,没有文件化的方法来实现这一点,我们必须求助于无文件化的方法。其中一种是: 获取线程状态信息的基本步骤是 遵循(当然知道进程ID(因此是第四个PID)和 线程ID(TID)):
链接文章包含必要的代码。此函数不检查挂起状态,只检查运行的
exeFileName
实例。可以挂起线程,而不是进程,因此我假设您对挂起进程的解释是一个进程,其中所有线程都已挂起。不过,这不是很有用的信息,因为任何进程都可以调用CreateRemoteThread
,从而“取消挂起”进程。@IInspectable,您可以挂起进程(请参阅undocumentedNtSuspendProcess
函数)。@Victoria:据我所知,这也会迭代所有线程并挂起它们。进程对象中没有存储挂起/恢复状态的条目。有鉴于此,我之前的评论仍然有效:被暂停不是流程固有的属性。因此,如果你问一个问题,进程是否被挂起,你必须记住这个答案是如何得出的,才能理解使用这个答案的后果。这个函数不检查挂起状态,只检查运行的exeFileName
实例。可以挂起线程,而不是进程,所以我假设您对挂起进程的解释是一个进程,其中所有线程都已挂起。不过,这不是很有用的信息,因为任何进程都可以调用CreateRemoteThread
,从而“取消挂起”进程。@IInspectable,您可以挂起进程(请参阅undocumentedNtSuspendProcess
函数)。@Victoria:据我所知,这也会迭代所有线程并挂起它们。进程对象中没有存储挂起/恢复状态的条目。有鉴于此,我之前的评论仍然有效:被暂停不是流程固有的属性。因此,如果你问一个问题,进程是否被挂起,你必须记住这个答案是如何得出的,才能理解使用这个答案的后果。WaitForSingleObject()
returningWAIT\u
被记录为只应用于互斥句柄,而不是线程句柄。而且,不管怎样,挂起线程返回废弃状态是没有意义的。等待线程句柄只会告诉你线程是否已终止,而不是它是否已挂起。@Remy我从web上获得了这些信息,但这是假的。也许是在一些古老的Windows版本中,