我怎样才能获得进程暂停状态?

时间:2018-02-06 09:33:00

标签: delphi winapi pascal lazarus

我想在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;

1 个答案:

答案 0 :(得分:4)

该代码不会尝试检查进程是否被暂停。而是检查是否存在具有指定可执行文件名的进程。

我将假设您希望检测的进程暂停形式只是暂停该进程中的所有线程。据我所知,没有记录的方法来实现这一点,我们必须采用无证方法。其中一个描述为here

  

获取线程状态信息的基本步骤是   跟随(当然知道进程ID(因此第四个PID)和   线程ID(TID)):

     
      
  1. 调用NtQuerySystemInformation并将SystemInformation设置为SystemProcessInformation(5)
  2.   
  3. 迭代SYSTEM_PROCESS_INFORMATION结构数组以找到您感兴趣的PID(ProcessId成员)
  4.   
  5. 迭代SYSTEM_THREAD结构数组(详见下文)以找到所需的TID(UniqueThread成员)并检查State和   WaitReason会员;如果线程被挂起,则两者都必须设置为5   除此之外的任何其他价值
  6.         

    对大多数热衷于系统级别的人来说,这可能是显而易见的   编程,一个进程在它的所有线程都被挂起时被暂停   暂停,所以必须检查他们所有的暂停状态。

链接文章包含必要的代码。