使用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回调。
请你帮忙。
感谢。
答案 0 :(得分:2)
一旦有了PID,就有两种方法可以发现它创建的窗口。
调用EnumWindows()
枚举所有顶级窗口。传递给它的回调函数可以使用GetWindowThreadProcessId()
来检查每个窗口是否属于PID。
使用CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD)
,Thread32First()
和Thread32Next()
枚举所有正在运行的线程,查找属于PID的线程,在每个匹配的线程上调用EnumThreadWindows()
请注意,在这两种情况下,您只会枚举顶级窗口。如果目标进程创建子窗口而不是顶级窗口,特别是为了在不同进程的其他窗口中托管这些子窗口,那么您将不得不使用#1,但忽略顶级窗口的PID和使用EnumChildWindows()
来枚举他们的子窗口,而不是在子窗口上使用setPositiveButton
。