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 MainWindow anhand der ProcessID ermitteln ? (https://www.delphipraxis.net/93889-mainwindow-anhand-der-processid-ermitteln.html)

stoxx 12. Jun 2007 20:24


MainWindow anhand der ProcessID ermitteln ?
 
ich starte eine Excel Datei. von der habe ich die ProcessID, nun will ich das Mainwindow rausfinden, aber welches ist es ????

Dummerweise gibt es mehrere HAndles zu dieser ProcessID ....

folgender Code liefert das Ergebnis:

Fensterhandle : 3152256 Parent: 0 Owner : 0
Fensterhandle : 2429158 Parent: 0 Owner : 0
Fensterhandle : 2693338 Parent: 0 Owner : 0
Fensterhandle : 2431246 Parent: 65556 Owner : 0
Fensterhandle : 3021012 Parent: 0 Owner : 0
Fensterhandle : 2824432 Parent: 2429158 Owner : 2429158
Fensterhandle : 2103562 Parent: 2824432 Owner : 2824432





Delphi-Quellcode:
type

  TEnumWinData = record
    WinHandle: HWND;
    WinClassName: string;
    WinCaption: WideString;
    CaptionCount: word;
    ParentHandle: HWND;
    ProcessID: DWORD;
  end;
  PEnumWinData = ^TEnumWinData;


  var sDebug : STring;

function MyEnumWindowProc(AHandle: THandle; EWD: PEnumWinData): boolean; stdcall;
var
  ProcessID: THandle;
  hWnd_Owner : THandle;
  hWnd_Parent : THAndle;




begin
  ProcessID := 0;
  GetWindowThreadProcessID(AHandle, ProcessID);

  if (ProcessID = EWD.ProcessID) and
     IsWindow(AHAndle) then begin
      EWD.WinHandle := AHandle;
      hwnd_Parent := GetParent(AHandle);
      hWnd_Owner := GetWindow(AHandle, GW_OWNER);

      sDebug := sDebug
       + 'Fensterhandle : ' + inttostr(AHandle) +
        ' Parent: ' + inttostr(GetParent(AHandle)) +
        ' Owner : ' + inttostr(hwnd_Owner) + #13#10;


      result := true;
  end else
      result := true;
end;


function GetWindowHandleByProcessID(ProcessID : DWORD) : THandle;
var EWD : pENumWinData;
begin
   sDebug := '';
   result := 0;
   new(EWD);
   EWD.WinHandle := 0;
   EWD.ProcessID := ProcessID;

   EnumWindows(@MyEnumWindowProc, Integer(EWD));
   result := EWD.WinHandle;
   sendDebug(sDebug);
   dispose(EWD);
end; // getWindowHandleByProcessID

sirius 12. Jun 2007 21:20

Re: MainWindow anhand der ProcessID ermitteln ?
 
Vielleicht über den Titel des Fensters probieren....

stoxx 13. Jun 2007 12:36

Re: MainWindow anhand der ProcessID ermitteln ?
 
Zitat:

Zitat von sirius
Vielleicht über den Titel des Fensters probieren....

geht ja nicht, weil ich den Fenstertitel nicht kenne ...
bzw. brauch ich ja das MainWindow um das Handle des Fenstertitels zu bekommen ;-)
um dann den Titel zu haben ...

sirius 13. Jun 2007 12:49

Re: MainWindow anhand der ProcessID ermitteln ?
 
Ok, den Fenstertitel kennst du nicht. Aber an irgendetwas musst du doch dein Mainwindow - sozusagen als User - erkennen. Der Titel wäre das einfachste.

DeinProcess hat anscheinend mehrere Fenster ohne Parent. Sind die alle sichtbar? Schau dir doch mal im Winsepctor an, woran du dein Mainwindow erkennst. Der Process selber unterscheidet nicht zwischen Main- und nicht Mainwindow.

shmia 13. Jun 2007 16:54

Re: MainWindow anhand der ProcessID ermitteln ?
 
Kopiert aus der JCL:
Delphi-Quellcode:
function IsMainAppWindow(Wnd: THandle): Boolean;
var
  ParentWnd: THandle;
  ExStyle: DWORD;
begin
  if IsWindowVisible(Wnd) then
  begin
    ParentWnd := GetWindowLong(Wnd, GWL_HWNDPARENT);
    ExStyle := GetWindowLong(Wnd, GWL_EXSTYLE);
    Result := ((ParentWnd = 0) or (ParentWnd = GetDesktopWindow)) and
      ((ExStyle and WS_EX_TOOLWINDOW = 0) or (ExStyle and WS_EX_APPWINDOW <> 0));
  end
  else
    Result := False;
end;

stoxx 13. Jun 2007 22:27

Re: MainWindow anhand der ProcessID ermitteln ?
 
also diese IsMainWindow Funktion funktioniert nur bedingt.
Sehr viele programme zeigen auch gar nicht mehr das Mainwindow als HAuptfenster.
Das HAuptfenster ist irgendwo im Hintergrund.
MAn muss da wohl unterscheiden, ob man wirklich das Mainwindow sucht, oder das sichtbare Fenster von dem Prozess.

Ich benutze jetzt folgende Funktion, um das sichtbare fenster zu bekommen;

Delphi-Quellcode:
function IsValidWindow(wnd : HWND) : boolean;// 
begin
 result := false;
 if wnd <> 0 then begin
   result := (GetSystemMenu(Wnd, false) <>0);
 end; // wnd <> 0

end; //  IsValidWindow
und prüfe noch:

Delphi-Quellcode:
  if (ProcessID = EWD.ProcessID) and
     IsValidWindow(AHandle) and
     IsWindowVisible(AHandle) then begin

    end;

helgew 2. Aug 2008 22:13

Re: MainWindow anhand der ProcessID ermitteln ?
 
Hatte gerade nach ProcessID <- hWnd gesucht. Danke!

Luckie 2. Aug 2008 22:30

Re: MainWindow anhand der ProcessID ermitteln ?
 
Zitat:

Zitat von stoxx
Delphi-Quellcode:
function IsValidWindow(wnd : HWND) : boolean;// 
begin
 result := false;
 if wnd <> 0 then begin
   result := (GetSystemMenu(Wnd, false) <>0);
 end; // wnd <> 0

end; //  IsValidWindow

Eine Anwendung mit einem Fenster ohne Systemmenü ist für dich also kein gültiges Fenster?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:48 Uhr.

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