Einzelnen Beitrag anzeigen

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