![]() |
FindWindow von Pfad
Ist es möglich bei Delphi7 einen Fensternamen eines Programmes anhand dessen .exe-Pfad herrauszufinden ? Wenn ja wie ?
Für einen fetzen Sourcecode wäre ich dankbar |
AW: FindWindow von Pfad
Du kannst mit
![]() ![]() |
AW: FindWindow von Pfad
Zitat:
|
AW: FindWindow von Pfad
Ähnliches Problem samt Lösungsvorschlägen:
![]() |
AW: FindWindow von Pfad
Zitat:
|
AW: FindWindow von Pfad
Der Vergleich ist aber doch derselbe. Ob Du nun von links oder von rechts kommst, dürfte doch egal sein.
|
AW: FindWindow von Pfad
Zitat:
Beispiele findet man eigentlich bei Google genug: ![]() z.B. ausführlich kommentiert: ![]() |
AW: FindWindow von Pfad
Ich habe erst seit einem halben Jahr Informatik und seit ca. 1/4 Jahr programmieren. Es ist für mich schon schwer zu verstehen wie ich die beiden Funktionen überhaupt benutze und mit einander verbine. Für mich wäre es am einfachsten einen Sourcecode zu sehen in den ich nurnoch meinen Pfad einsetzten müsste und am Ende den Fensternamen herausbekommen würde
|
AW: FindWindow von Pfad
Dafür gibt es die Forensuche (
![]() ![]() ![]() [edit] Wenn Du es selbst versuchst und dabei steckenbleibst, helfen wir natürlich gerne weiter, nicht, dass wir uns da missverstehen. [/edit] |
AW: FindWindow von Pfad
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:
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.
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; |
AW: FindWindow von Pfad
Liste der Anhänge anzeigen (Anzahl: 1)
Geht es nur darum, zu einem einzelnen, festgelegten Programm den aktuellen Fenstertitel zu ermitteln, insofern dieses Programm gestartet worden ist ? Dann geht das auch wesentlich direkter, also ohne aufwändiges Filtern diverser Listen:
Code:
Kompletter Code im Anhang.
procedure TForm1.Button1Click(Sender: TObject);
var PID: DWORD; ExePath: string; EnumInfo: TEnumInfo; begin // vor dem ButtonClick ein Explorerfenster öffnen // oder hier ein anderes Programm eintragen und starten ExePath := 'C:\WINXP\Explorer.exe'; PID := PathToPid(ExePath); if PID = 0 then begin ShowMessage(Exepath + #13#10'Process not found!'); exit; end; EnumInfo := FindMainWindow(PID); with EnumInfo do ShowMessage(format('Exe: %s'#13#10 + 'ProcessID: %d'#13#10 + 'Window Handle: %d'#13#10 + 'Window Class Name: %s'#13#10 + 'Window Title: "%s"', [ExePath, ProcessID, WindowHandle, ClassName, WindowTitle])); end; Komplizierter wird es allerdings etwas, wenn gleichzeitig mehrere Instanzen desselben Programms geladen sein sollten, da diese dann natürlich alle unterschiedliche PIDs und unterschiedliche Fensterhandles haben, wobei jede Instanz auch ihren eigenen Titel im sichtbaren Fenster aufweist. |
AW: FindWindow von Pfad
Zitat:
Bei mir kommen dann diese Fehlermeldungen.
Delphi-Quellcode:
[Fehler] Unit1.pas(91): Undefinierter Bezeichner: 'TEnumInfo'
[Fehler] Unit1.pas(97): Undefinierter Bezeichner: 'PathToPid' [Fehler] Unit1.pas(103): Undefinierter Bezeichner: 'FindMainWindow' [Fehler] Unit1.pas(109): Undefinierter Bezeichner: 'ProcessID' [Fehler] Unit1.pas(109): Undefinierter Bezeichner: 'WindowTitle' [Fehler] Unit1.pas(112): '.' erwartet, aber ';' gefunden [Fataler Fehler] Project1.dpr(5): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden |
AW: FindWindow von Pfad
Ja, das wird bestimmt funktionieren,
nur wirst du dir erstmal die fehlenden Funktionen und Definitionen suchen müssen. Angefangen mit ![]() Hatte auf die Schnelle ein FindMainWindow gefunden, welches zwar einen DWORD, anstatt TEnumInfo zurückgibt, aber wenn man genau hinguckt, wird intern nur ein Teil des TEnumInfo ans Result weitergegeben ... odrt kann man es so umbauen, daß das gesamte TEnumInfo ins Result wanders. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz