Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Fensterhandle zu einer Exe - auch wenn das Fenster minimiert ist (https://www.delphipraxis.net/172788-fensterhandle-zu-einer-exe-auch-wenn-das-fenster-minimiert-ist.html)

ThoPos 23. Jan 2013 06:44

Fensterhandle zu einer Exe - auch wenn das Fenster minimiert ist
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:35 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