AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Fensterhandle zu einer Exe - auch wenn das Fenster minimiert ist
Thema durchsuchen
Ansicht
Themen-Optionen

Fensterhandle zu einer Exe - auch wenn das Fenster minimiert ist

Ein Thema von ThoPos · begonnen am 23. Jan 2013
Antwort Antwort
ThoPos

Registriert seit: 30. Jun 2004
Ort: Köln
69 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Fensterhandle zu einer Exe - auch wenn das Fenster minimiert ist

  Alt 23. Jan 2013, 06:44
Hallo Zusammen,

ich habe momentan ein Problem mit dem Ermitteln des Fensterhandle zu einer Exe.

Auf Basis der vielen Beispiele in Foren habe ich mir in Delphi 2007 die unten stehende Function erstellt, welche mir die Handles zu allen Hauptfenstern einer angegebenen Exe ermittelt, auch wenn diese mehrfach läuft.

Nur gibt es eine "Lücke". Wenn ich z.B. alle Fenster zu "winword.exe" suche, aber Word gerade minimiert in der Taskleiste liegt, so finde ich kein Handle.

Kann mir bitte jemand erklären warum und wie ich diese Lücke schliessen kann?

Delphi-Quellcode:

type
  THandleArray = array of HWND

function GetWindowHandlesByExeName(const AExeName: string): THandleArray;
type
  PParam = ^TParam;
  TParam = record
    ProcID : THandle;
    Res : THandleArray;
  end;
var
  SnapShot : THandle;
  p : TProcessEntry32;
  ProcessHandle : THandle;
  Rec : TParam;

  function MyEnumWindowProc(AHandle: THandle; _LParam: LParam): LongBool; stdcall;
  var
    ProcessID : THandle;
    PHandle : THandle;
    i : Integer;
    g : Boolean;
  begin
    with PParam(_LParam)^ do
    begin
      ProcessID := 0;
      GetWindowThreadProcessID(AHandle, ProcessID);
      Result := not (ProcessID = ProcID);
      if not Result then
      begin
        pHandle := GetParent(AHandle);
        while pHandle <> 0 do
        begin
          AHandle := PHandle;
          pHandle := GetParent(AHandle);
        end;
        g := False;
        for i := low(Res) to high(Res) do
          if Res[i] = AHandle then
            g := True;
        if not g then
        begin
          SetLength(Res, Length(Res) + 1);
          Res[Length(Res)-1] := AHandle;
        end;
      end;
    end;
  end;

begin
  SetLength(Rec.Res, 0);
  ProcessHandle := 0;
  p.dwSize := SizeOf(p);
  SnapShot := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(SnapShot, p) then
      repeat
      if AnsiLowerCase(AExeName) = AnsiLowerCase(p.szExeFile) then
        ProcessHandle := p.th32ProcessID;
        Rec.ProcID := ProcessHandle;
        EnumWindows(@MyEnumWindowProc, Integer(@Rec));
      until not Process32Next(SnapShot, p);
    Result := Rec.Res;
  finally
    CloseHandle(SnapShot);
  end;
end;
Thomas
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:53 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