Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenstername und Dateiname aus Handle herausfinden (https://www.delphipraxis.net/166877-fenstername-und-dateiname-aus-handle-herausfinden.html)

himitsu 10. Mär 2012 14:43

AW: Fenstername und Dateiname aus Handle herausfinden
 
Zitat:

Zitat von Delphi-Laie (Beitrag 1155770)
Außerdem liegt es immer noch auf Deiner Internetseite, also stehst Du weiterhin zu dieser Deiner (angeblichen) "Jugendsünde".

Ich würde es hier einfach als Dokumentation der eigenen Vortschritte bezeichnen.

Nja, das ist halt so ... man lernt (hoffentlich) dazu und verbessert seine neueren Codes.

Delphi-Laie 10. Mär 2012 18:34

AW: Fenstername und Dateiname aus Handle herausfinden
 
Zitat:

Zitat von Luckie (Beitrag 1155775)
da ja sowoesi alles bei mir opensource ist.

Einspruch, Euer Ehren! Was ist mit Deinem Flaggschiff, dem "XP Usermanager"?!

himitsu 10. Mär 2012 18:35

AW: Fenstername und Dateiname aus Handle herausfinden
 
Für DP-ler ist der immerhin kostenlos. :thumb:
Und große Teile des Codes verstecken sich stückchenweise auch hier und da in der DP, bzw. auf seiner Webseite.

Wurde der schon mit Win8 getestet?

Helmi 11. Mär 2012 08:46

AW: Fenstername und Dateiname aus Handle herausfinden
 
so - jetzt lassen wir mal Luckies Schandtaten bei Seite :-) - und kommen wieder zum eigentlichen Thema zurück, irgendwie hab ich da immer noch ein Verständnis-Problem.

Ich hab einen Fenster-Handle und möchte von der Application den Titel ermitteln.

Wenn ich Himitsu´s Beispiel richtig verstanden habe, dann kann ich mittels
Delphi-Quellcode:
H := FindWindowEx(0, H, 'TApplication', nil);
das Nicht-sichtbare Fenster des Fenster-Handles in H ermitteln.

Ich hab das mal bei mir umgesetzt:
Delphi-Quellcode:
function FensterText(Wnd: HWND): String;
var
  AWnd : HWND;
  WText: array[0..MAX_PATH - 1] of Char;

begin
  //Rückgabewert vordefinieren
  Result := '';

  //prüfen ob ein Fenster-Handle übergeben wurde
  If Wnd = 0 then
    exit;

  //Handle der Application zu dem Fenster auslesen
  AWnd := FindWindowEx(0, Wnd, 'TApplication', nil);

  //Fenster-Text auslesen
  If GetWindowText(AWnd, @WText, Length(WText)) > 0 then
    //Rückgabewert = Fenster-Name
    Result := String(WText)
  else
    //Rückgabewert = SystemFehler
    Result := SysErrorMessage(GetlastError);
end;
Ich habe (in einer Liste) die Fenster-Handles zweier unterschiedlicher Prozesse.
Bei dem ersten Fenster-Handle erhalte ich auch den richtigen Application-Titel.
Bei dem zweiten Handle immer den Titel des ersten Handles.
Oder ich erhalte beim zweiten Handle die Meldung "Das Fenster hat keine Bildlaufleisten"

Also entweder ich hab einen Gedankenfehler bei der Verwendung von FindWindowEx oder ich hab schlicht und einfach etwas am Code vergessen.

himitsu 11. Mär 2012 12:18

AW: Fenstername und Dateiname aus Handle herausfinden
 
FindWindwoEx (mit hwndChildAfter=0) arbeitet wie FindWindow und findet das erste Fenster, in der windowsinternen Fensterliste.

FindWindwoEx (mit hwndChildAfter<>0) findet das Fenster, welches in dieser Windows-Liste dahinter aufgeführt ist.

Ich weiß jetzt nicht, ob das eine zufällige Reihenfolge ist, oder ob das die Erstellungsreihenfolge ist, oder ob es z.B. nach der Z-Achsen-Reihenfolge sortiert ist.

Dieser Parameter ist also "nur" eine Art Index

Die Fenster "wnd" und "awnd" haben aber keinerlei Beziehung zueinander. (gehören also z.B. nicht unbedingt zur selben Anwendung oder sonstwas)



Das Handle "wnd" 0 hast du abgefangen?
Das erste Fenster kann also nie ausgelesen werden.

Und wenn man das Handle des letzen Fensters, dieser Liste, angibt, dann dann gibt FindWindowEx 0 zurück und wovon soll dann GetWindowText dann den Text holen?

Helmi 11. Mär 2012 12:31

AW: Fenstername und Dateiname aus Handle herausfinden
 
Zitat:

Zitat von himitsu (Beitrag 1155977)
Das Handle "wnd" 0 hast du abgefangen?

Ja, ist im Code von mir auch zu sehen:
Delphi-Quellcode:
 //prüfen ob ein Fenster-Handle übergeben wurde
   If Wnd = 0 then
     exit;
Oder meinst du AWnd?


Zitat:

Zitat von himitsu (Beitrag 1155977)
Und wenn man das Handle des letzen Fensters, dieser Liste, angibt, dann dann gibt FindWindowEx 0 zurück und wovon soll dann GetWindowText dann den Text holen?

Erwartest du jetzt von mir eine Antwort? :-)

himitsu 11. Mär 2012 13:16

AW: Fenstername und Dateiname aus Handle herausfinden
 
Jupp. :angle:

Delphi-Quellcode:
function FensterText(Wnd: HWND): String;

Wo kommt denn Wnd her und was ist darin?

Delphi-Quellcode:
  //prüfen ob ein Fenster-Handle übergeben wurde
  If Wnd = 0 then
    exit;

  //Handle der Application zu dem Fenster auslesen
  AWnd := FindWindowEx(0, Wnd, 'TApplication', nil);
Da Wnd nie 0 ist, kann FindWindowEx niemals das erste TApplication zurückgeben.

Und
Delphi-Quellcode:
  //Handle der Application zu dem Fenster auslesen
  AWnd := FindWindowEx(0, Wnd, 'TApplication', nil);

  if AWnd = 0 then
    {es wurde nicht gefunden}

Helmi 11. Mär 2012 13:24

AW: Fenstername und Dateiname aus Handle herausfinden
 
Zitat:

Zitat von himitsu (Beitrag 1155998)
Jupp. :angle:

Delphi-Quellcode:
function FensterText(Wnd: HWND): String;

Wo kommt denn Wnd her und was ist darin?

hier raus:
Delphi-Quellcode:
function PHandle_to_WHandle(const PHandle: Cardinal): HWND;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
   begin
     TList(lParam).Add(Pointer(hWnd));
     Result := True;
   end;

var
   i         : Integer;
   List      : TList;
   ProcessId : DWORD;

begin
  //Rückgabewert vordefinieren
  Result := 0;

  If PHandle <= 0 then
    exit;

  //Liste erzeugen
  List := TList.Create;

  try
    If EnumWindows(@EnumWindowsProc, Integer(List)) then
      for i := 0 to Pred(List.Count) do
        begin
          If GetWindowThreadProcessId(Integer(List.Items[i]), ProcessId) > 0 then
            //Wenn die Prozess-ID gefunden wurde, dann das Handle aus der
            //Liste zurückgeben und die Schleife verlassen
            If GetProcessId(PHandle) = ProcessId then
              begin
                Result := Integer(List.Items[i]);

                break;
              end;
        end;
  finally
    //Liste löschen und freigeben
    FreeAndNil(List);
  end;
end;
Zitat:

Zitat von himitsu (Beitrag 1155998)
Delphi-Quellcode:
  //prüfen ob ein Fenster-Handle übergeben wurde
  If Wnd = 0 then
    exit;

  //Handle der Application zu dem Fenster auslesen
  AWnd := FindWindowEx(0, Wnd, 'TApplication', nil);
Da Wnd nie 0 ist, kann FindWindowEx niemals das erste TApplication zurückgeben.

Ist das jetzt gut oder schlecht?
Muss ich also null möglich machen oder nicht

Helmi 18. Mär 2012 13:23

AW: Fenstername und Dateiname aus Handle herausfinden
 
Hallo,

ich möchte dieses Thema nochmal aufwärmen.

Delphi-Laie 18. Mär 2012 14:10

AW: Fenstername und Dateiname aus Handle herausfinden
 
Zitat:

Zitat von Helmi (Beitrag 1157209)
ich möchte dieses Thema nochmal aufwärmen.

Womit?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:29 Uhr.
Seite 3 von 4     123 4      

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