[b]function[/b] GetThreadID(FileName: [b]String[/b]): DWord;
[b]var[/b]
ToolHnd, MToolHnd: THandle;
PE32: TProcessEntry32;
ME32: TModuleEntry32;
TE32: TThreadEntry32;
PIDArray, ThreadArray: [b]Array[/b] [b]of[/b] Dword;
a: Integer;
PID: DWord;
[b]begin[/b]
ToolHnd := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS [b]or[/b] TH32CS_SNAPTHREAD, 0); [i]//
Handle auf Snapshot[/i]
PE32.dwSize := SizeOf(ProcessEntry32);
Process32First(ToolHnd, PE32); [i]//erster Prozess[/i]
[b]if[/b] PE32.szExeFile = ExtractFileName(FileName) [b]then[/b]
[b]begin[/b]
SetLength(PIDArray, 1);
PIDArray[0] := PE32.th32ProcessID;
[b]end[/b];
[b]while[/b] Process32Next(ToolHnd, PE32) [b]do[/b]
[b]begin[/b]
[b]if[/b] PE32.szExeFile = ExtractFileName(FileName) [b]then[/b]
[b]begin[/b]
SetLength(PIDArray, Length(PIDArray) + 1);
PIDArray[Length(PIDARRAY) - 1] := PE32.th32ProcessID;
[b]end[/b];
[b]end[/b];
[i]//ShowMessage(InttoStr(PIDArray[0]));
{ Jetzt sind alle PIDs der Prozesse, deren Dateinamen gleich dem gesuchten ist, gespeichert }
{ Jetzt wird für jeden Prozess anhand der Modulliste der vollständige Pfad ermittelt und so }
{ die endgültige, richtige ProcessID ermittelt. }[/i]
PID := 0;
[b]for[/b] a := 0 [b]to[/b] Length(PIDArray) -1 [b]do[/b]
[b]begin[/b]
MToolHnd := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PIDArray[a]); [i]//Modulliste des gewählten Prozesses[/i]
Module32First(MToolhnd, ME32);
[b]if[/b] ME32.szExePath = FileName [b]then[/b]
[b]begin[/b]
PID := ME32.th32ProcessID;
[b]end[/b]
[b]else[/b]
[b]while[/b] Module32Next(MToolHnd, ME32) [b]do[/b]
[b]begin[/b]
[b]if[/b] ME32.szExePath = FileName [b]then[/b]
[b]begin[/b]
PID := ME32.th32ProcessID;
break;
[b]end[/b];
[b]end[/b];
CloseHandle(MToolHnd);
[b]if[/b] PID <> 0 [b]then[/b] break;
[b]end[/b];
[i]//ShowMessage(InttoStr(PID));
{ Jetzt werden alle Threads des Prozesses ermittelt }[/i]
TE32.dwSize := SizeOf(ThreadEntry32);
Thread32First(ToolHnd, TE32);
[i]//Form1.Listbox1.Items.Add(InttoStr(TE32.th32OwnerProcessID) + 'Thread ' + InttoStr(TE32.th32ThreadID) + ' gehört zu Prozess ' + InttoStr(TE32.th32OwnerProcessID));[/i]
[b]if[/b] TE32.th32OwnerProcessID = PID [b]then[/b]
[b]begin[/b]
SetLength(ThreadArray,1);
ThreadArray[0] := TE32.th32ThreadID;
[b]end[/b];
[b]while[/b] Thread32Next(ToolHnd, TE32) [b]do[/b]
[b]begin[/b]
[i]//Form1.Listbox1.Items.Add(InttoStr(TE32.th32OwnerProcessID) + 'Thread ' + InttoStr(TE32.th32ThreadID) + ' gehört zu Prozess ' + InttoStr(TE32.th32OwnerProcessID));[/i]
[b]if[/b] TE32.th32OwnerProcessID = PID [b]then[/b]
[b]begin[/b]
SetLength(ThreadArray,1);
ThreadArray[0] := TE32.th32ThreadID;
[b]end[/b];
[b]end[/b];
CloseHandle(ToolHnd);
ShowMessage(InttoStr(ThreadArray[0]));
Result := ThreadArray[0];
[b]end[/b];