![]() |
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 |
Re: MainWindow anhand der ProcessID ermitteln ?
Vielleicht über den Titel des Fensters probieren....
|
Re: MainWindow anhand der ProcessID ermitteln ?
Zitat:
bzw. brauch ich ja das MainWindow um das Handle des Fenstertitels zu bekommen ;-) um dann den Titel zu haben ... |
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. |
Re: MainWindow anhand der ProcessID ermitteln ?
Kopiert aus der
![]()
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; |
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:
und prüfe noch:
function IsValidWindow(wnd : HWND) : boolean;//
begin result := false; if wnd <> 0 then begin result := (GetSystemMenu(Wnd, false) <>0); end; // wnd <> 0 end; // IsValidWindow
Delphi-Quellcode:
if (ProcessID = EWD.ProcessID) and
IsValidWindow(AHandle) and IsWindowVisible(AHandle) then begin end; |
Re: MainWindow anhand der ProcessID ermitteln ?
Hatte gerade nach ProcessID <- hWnd gesucht. Danke!
|
Re: MainWindow anhand der ProcessID ermitteln ?
Zitat:
|
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