function GetMainTID(Pid:Cardinal):Cardinal;
{uses Winapi.TlHelp32
function OpenThread(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwThreadId: DWORD): THandle; stdcall; external Kernel32 name 'OpenThread';
}
var
MinT:TFileTime;
hThreadSnap:THandle;
hNowThread:THandle;
pe32:TThreadEntry32;
CreateTime, ExitTime, KernelTime, UserTime: TFileTime;
begin
Result:=0;
ZeroMemory(@MinT,SizeOf(TFileTime));
hThreadSnap:= CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if(hThreadSnap = INVALID_HANDLE_VALUE) then Exit;//如果获取失败返回
pe32.dwSize:=SizeOf(TThreadEntry32);
if Thread32First(hThreadSnap,pe32) then
begin
repeat
if pe32.th32OwnerProcessID = Pid then
begin
hNowThread := OpenThread(THREAD_QUERY_INFORMATION, false, pe32.th32ThreadID);
if GetThreadTimes(hNowThread, CreateTime, ExitTime, KernelTime, UserTime) then
begin
// OutputDebugString(PWideChar(Format('%u %u %u',[pe32.th32ThreadID,CreateTime.dwLowDateTime, CreateTime.dwHighDateTime])));
if Result = 0 then
begin
MinT.dwLowDateTime:=CreateTime.dwLowDateTime;
MinT.dwHighDateTime:=CreateTime.dwHighDateTime;
Result:= pe32.th32ThreadID;
end else begin
if MinT.dwHighDateTime > CreateTime.dwHighDateTime then //高位早于当前保存的 直接换不用判断低位了
begin
MinT.dwLowDateTime:=CreateTime.dwLowDateTime;
Result:= pe32.th32ThreadID;
end else if (MinT.dwHighDateTime = CreateTime.dwHighDateTime) and (MinT.dwLowDateTime > CreateTime.dwLowDateTime) then//高位一样对比低位 早于当前保存的就换
begin
MinT.dwLowDateTime:=CreateTime.dwLowDateTime;
Result:= pe32.th32ThreadID;
end;
end;
end;
CloseHandle(hNowThread);
end;
until not Thread32Next(hThreadSnap, pe32);
end;
CloseHandle(hThreadSnap);
end;