Ich habe soeben feststellen müssen, dass das Ganze wohl wirklich nicht so ganz ohne ist. Daher habe ich 2 Hilfsfunktionen geschrieben, ich hoffe, das hilft zunächst weiter, Fehler sind natürlich vorbehalten.
Delphi-Quellcode:
uses TLHelp32, PsAPI;
function ExeNameFromProcessID(ID: Cardinal):
string;
var
ProcessHandle: THandle;
begin
Result := '
';
ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION
or PROCESS_VM_READ,
false, ID);
if ProcessHandle <> 0
then
try
SetLength(Result, MAX_PATH);
if GetModuleFileNameEx(ProcessHandle, 0, PChar(Result), Length(Result)) <> 0
then
SetLength(Result, StrLen(PChar(Result)));
finally
CloseHandle(ProcessHandle);
end;
end;
procedure ListExeNamesAndIDs(
const ResultList: TStrings);
var
PE: TProcessEntry32;
Snap: THandle;
ExeName:
string;
begin
Assert(Assigned(ResultList));
ResultList.BeginUpdate;
try
ResultList.Clear;
Snap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PE.dwSize := SizeOf(
PE);
if Snap <> 0
then
try
if Process32First(Snap,
PE)
then
repeat
ExeName := ExeNameFromProcessID(
PE.th32ProcessID);
if ExeName <> '
'
then
ResultList.AddObject(ExeName, TObject(
PE.th32ProcessID));
until not Process32Next(Snap,
PE);
finally
CloseHandle(Snap);
end;
finally
ResultList.EndUpdate;
end;
end;
Für Dich von Belang ist dabei ListExeNamesAndIDs. Der übergibst Du ein TStrings-Objekt (Stringliste, ListBox.Items, ComboBox.Items oder Ähnliches), und dieses sollte nach dem Aufruf die kompletten Pfade zu den laufenden Prozessen sowie deren ProcessID (im Object-Feld hinterlegt) enthalten. Diese Liste kannst Du nun nach dem gesuchten Pfad filtern, die ProcessID auslesen und zum Vergleich für EnumWindows und GetWindowThreadProcessID heranziehen. Wenn ich keinen Denkfehler mache/gemacht habe, sollte das eigentlich funktionieren.