Thema: Delphi FindWindow von Pfad

Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#10

AW: FindWindow von Pfad

  Alt 2. Mai 2012, 20:30
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat