可能重复:
确定当前app的父进程
我想获取进程的 MainProcess 句柄或 PID。例如,谷歌浏览器会为每个选项卡删除另一个进程,这些进程实际上是线程。在 ProcessExplorer 中,它在树视图中将 chrome.exe 显示为主进程及其下方的线程。如何检查或获取 MainProcess 句柄/PID?类似于 WindowsAPI 的东西?
谢谢你的帮助。
可能重复:
确定当前app的父进程
我想获取进程的 MainProcess 句柄或 PID。例如,谷歌浏览器会为每个选项卡删除另一个进程,这些进程实际上是线程。在 ProcessExplorer 中,它在树视图中将 chrome.exe 显示为主进程及其下方的线程。如何检查或获取 MainProcess 句柄/PID?类似于 WindowsAPI 的东西?
谢谢你的帮助。
@RRUZ 已经在 Stack Overflow 上回答了一个几乎相同的问题。但是,那里的代码不正确,因为它将进程 ID 声明为THandle
. 以下更正了我发现的错误,并且还调整了例程以返回 PID 而不是文件名:
uses
Windows,
tlhelp32,
SysUtils;
function GetParentPid: DWORD;
var
HandleSnapShot: THandle;
EntryParentProc: TProcessEntry32;
CurrentProcessId: DWORD;
HandleParentProc: THandle;
ParentProcessId: DWORD;
begin
Result := 0;
HandleSnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //enumerate the process
if HandleSnapShot<>INVALID_HANDLE_VALUE then
begin
EntryParentProc.dwSize := SizeOf(EntryParentProc);
if Process32First(HandleSnapShot, EntryParentProc) then //find the first process
begin
CurrentProcessId := GetCurrentProcessId; //get the id of the current process
repeat
if EntryParentProc.th32ProcessID=CurrentProcessId then
begin
ParentProcessId := EntryParentProc.th32ParentProcessID; //get the id of the parent process
HandleParentProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ParentProcessId);
if HandleParentProc<>0 then
begin
Result := ParentProcessId;
CloseHandle(HandleParentProc);
end;
break;
end;
until not Process32Next(HandleSnapShot, EntryParentProc);
end;
CloseHandle(HandleSnapShot);
end;
end;
我知道这是一个重复的问题,但这里的代码正是 OP 想要的,所以我至少让它可见一段时间。