Zitat:
Wobei es auch sein kann, daß es andere Programme mit dem selben Fensternamen gibt,
oder das gefundene Fenster gehört zur gleichen EXE, aber in einem anderen Verzeichns.
Der einzige Weg, um ein bestimmtes Programm zu finden, geht also nur über den EXE Namen, inkl. Pfad.
Zitat:
Dateinamen können natürlich auch von anderen Anwendungen verwendet werden, und Pfade sind öft vom Benutzer wählbar.
Ganz recht.
Und dazu schaut man eben über die vorgeschlagene Funktion FindWindowEx() zunächst nach, ob überhaupt ein Fenster mit dem partiellen Titel der zu erfragenden Applikation existiert.
Falls nämlich nicht, hat sich die Sache bereits erledigt.
Falls ja, dann kann man sich entscheiden:
(a) die Zuordnung des Fensters ist aus dem Kontext unzweifelhaft eindeutig, womit das ohne weitere Abfragen geklärt wäre.
(b) man muss/möchte auf Nummer Sicher gehen und etwaige Zweifel an der Zuordnung des Fensters zur erfragten Applikation beseitigen: man hat ja mit dieser Funktion FindWindowEx() gleichzeitig das zu eben diesem Fenster zugehörige
Handle und holt sich nun mit Hilfe dieses Handles vermittels des Prozesses den Filenamen inkl. kompletten Pfad der Applikation, zu dem das Fenster gehört. Womit das dann - ohne "Wenn" und "Aber" - definitiv und ggf. auch für mehrere Fenster mehrerer Instanzen, geklärt wäre.
Code:
function GetProcessNameFromWnd(Wnd: HWND): string;
var
List: TStringList;
PID: DWORD;
I: Integer;
begin
Result := '';
if IsWindow(Wnd) then
begin
PID := INVALID_HANDLE_VALUE;
Windows.GetWindowThreadProcessId(Wnd, @PID);
List := TStringList.Create;
try
if RunningProcessesList(List, True) then
begin
I := List.IndexOfObject(Pointer(PID));
if I > -1 then
Result := List[I];
end;
finally
List.Free;
end;
end;
end;
Im weiteren (insbes. zur noch benötigten RunningProcessesList()) siehe
http://www.delphitricks.com/source-c...ow_handle.html