如果我只有PID(进程ID)

时间:2016-04-15 14:24:03

标签: delphi delphi-7

使用Delphi(在本例中为Delphi 7),如何从PID(进程ID)获取Window Title。

我正在尝试捕获“Internet Explorer / Chrome”窗口标题。

到目前为止我的代码:

procedure GetAllBrowserTitle;
var
  hProcSnap    : THandle;
  pe32         : TProcessEntry32;
  P            : string;
  PID          : integer;
  ContinueLoop : BOOL;
begin

  try
    hProcSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if hProcSnap = INVALID_HANDLE_VALUE then exit;

    pe32.dwSize  := SizeOf(pe32);
    ContinueLoop := Process32First(hProcSnap, pe32);

    While (Integer(ContinueLoop) <> 0) do
    begin

      P := LowerCase(pe32.szExeFile);

      if (Pos('iexplore.exe', P) > 0) Or (Pos('chrome.exe', P) > 0) then
      begin
        PID   := pe32.th32ProcessID;
        // Get the Window Title
        // ???
      end;

      ContinueLoop := Process32Next(hProcSnap, pe32);
    end;

    CloseHandle(hProcSnap);

  except
  end;
end;

我不知道的部分是获得Window Title。根据我的研究,所有示例都需要Window Handle或使用我不太了解的EnumWindow回调。

请你帮忙。

感谢。

1 个答案:

答案 0 :(得分:2)

一旦有了PID,就有两种方法可以发现它创建的窗口。

  1. 调用EnumWindows()枚举所有顶级窗口。传递给它的回调函数可以使用GetWindowThreadProcessId()来检查每个窗口是否属于PID。

  2. 使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD)Thread32First()Thread32Next()枚举所有正在运行的线程,查找属于PID的线程,在每个匹配的线程上调用EnumThreadWindows()

  3. 请注意,在这两种情况下,您只会枚举顶级窗口。如果目标进程创建子窗口而不是顶级窗口,特别是为了在不同进程的其他窗口中托管这些子窗口,那么您将不得不使用#1,但忽略顶级窗口的PID和使用EnumChildWindows()来枚举他们的子窗口,而不是在子窗口上使用setPositiveButton