Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FindWindow von Pfad (https://www.delphipraxis.net/168054-findwindow-von-pfad.html)

Premaider 2. Mai 2012 17:03

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

jaenicke 2. Mai 2012 17:20

AW: FindWindow von Pfad
 
Du kannst mit EnumWindows die Liste der Fenster durchgehen und mit GetWindowThreadProcessId herausfinden, zu welchem Prozess dieses Fenster gehört.

Premaider 2. Mai 2012 17:30

AW: FindWindow von Pfad
 
Zitat:

Zitat von jaenicke (Beitrag 1164599)
Du kannst mit EnumWindows die Liste der Fenster durchgehen und mit GetWindowThreadProcessId herausfinden, zu welchem Prozess dieses Fenster gehört.

Ich verstehe die msdn-Beispiele nie wirklich. Könnest du mir ein Beispiel geben ?

DeddyH 2. Mai 2012 18:05

AW: FindWindow von Pfad
 
Ähnliches Problem samt Lösungsvorschlägen: http://www.delphipages.com/forum/showthread.php?t=96891

Premaider 2. Mai 2012 18:08

AW: FindWindow von Pfad
 
Zitat:

Zitat von DeddyH (Beitrag 1164606)
Ähnliches Problem samt Lösungsvorschlägen: http://www.delphipages.com/forum/showthread.php?t=96891

Das Problem ist dort wird die exe anhand des Handles gesucht. Ich suche das Handle anhand der exe

DeddyH 2. Mai 2012 18:14

AW: FindWindow von Pfad
 
Der Vergleich ist aber doch derselbe. Ob Du nun von links oder von rechts kommst, dürfte doch egal sein.

jaenicke 2. Mai 2012 18:16

AW: FindWindow von Pfad
 
Zitat:

Zitat von Premaider (Beitrag 1164601)
Ich verstehe die msdn-Beispiele nie wirklich. Könnest du mir ein Beispiel geben ?

Was hast du denn versucht?

Beispiele findet man eigentlich bei Google genug:
Bei Google suchendelphi enumwindows
z.B. ausführlich kommentiert:
http://delphi.about.com/od/windowssh.../aa080304a.htm

Premaider 2. Mai 2012 18:28

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

DeddyH 2. Mai 2012 18:33

AW: FindWindow von Pfad
 
Dafür gibt es die Forensuche (Hier im Forum suchenEnumWindows, Hier im Forum suchenGetWindowThreadProcessID, Hier im Forum suchenCreateToolHelp32Snapshot). Wenn Du Dir eine Aufgabe suchst, die (momentan) einige Nummern zu hoch für Dich ist, so kann es nicht die Lösung sein, Dir diese komplett auf dem Silbertablett zu servieren, dabei lernst Du ja nichts.

[edit] Wenn Du es selbst versuchst und dabei steckenbleibst, helfen wir natürlich gerne weiter, nicht, dass wir uns da missverstehen. [/edit]

DeddyH 2. Mai 2012 19:30

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:
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.

ASM 3. Mai 2012 02:01

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:
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;
Kompletter Code im Anhang.

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.

Premaider 3. Mai 2012 15:21

AW: FindWindow von Pfad
 
Zitat:

Zitat von ASM (Beitrag 1164653)
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:
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;
Kompletter Code im Anhang.

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.

Sicher, das das mit Delphi7 funktioniert ?

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

himitsu 3. Mai 2012 15:36

AW: FindWindow von Pfad
 
Ja, das wird bestimmt funktionieren,
nur wirst du dir erstmal die fehlenden Funktionen und Definitionen suchen müssen.

Angefangen mit Hier im Forum suchenFindMainWindow (wo sich auch TEnumInfo finden läßt).

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 12:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz