![]() |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Ich hoffe ich nerve nicht :(, aber die Probleme gehen weiter.
Leider konnte ich im Netz nichts finden. Gibt es eine einfache Möglichkeit, alle Fensterhandle zu ermitteln und z.B. in einer TStringList zu speichern? ich habe große Probleme, nach dem Fensterhandle zu suchen, wenn das Programmfenster des externen Programmes minimiert ist, das Hauptprogramm mit den Buttons den Fokus hat oder aber ein Unterprogramm des externen Programmes geöffnet ist. Ich dachte beim Unterprogramm könnte ich einfach mittels aktHndl := GetTopWindow(GetDesktopWindow); wTmpH := GetParent(aktHndl); das Handle des externen Hauptfensters ermitteln, aber weit gefehlt. Es liefert mir ständig ein anderes Handle zurück. Und im falle des Fokus auf meinen "Taskmamager" bin ich mir auch nicht ganz sicher, ob ich so einfach nach dem handle des externen Hauptfensters suchen kann, was ist z.B. wenn es minimiert oder gar "unsichtbar" ist, da ein Unterprogramm aktivi ist, was wiederum vielleicht minimiert ist? Deswegen wäre es mir an dieser Stelle lieb, wenn ich eine Möglichkeit hätte, alle aktuellen Fensterhandles des Systems zu ermitteln um dort dann einfach zu suchen, ob mein Handle mit von der Partie ist. |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Spontan fällt mir da
![]() |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Danke, zusätzlich konnte ich noch
![]() |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Der Fehler liegt bei mir :? .
Durch das Probieren mit EnumWindows bin ich drauf gekommen, daß die Handle schon noch existieren, FindWindowsEx jedoch 0 zurückliefern muß, da ich ja immer noch bei der Suche nach dem speziellen Fenstername gesucht habe. Nehme ich den raus, wird das Handle gefunden, auch wenn ein anderes Fenster aktiv ist bzw. ein Unterpgrogramm und der Timer kann nun entsprechend reagieren. Durch die EnumWindows-Funktionen jedoch spare ich mir viel Auswertungskram und kann direkt die Liste durchsuchen. |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Eine Frage:
ich arbeite nun mit der EnumWindowsUnit, wie von mir schon verlinkt. Nun kommt es vor, das ein externes Programm wiederum ein anderes externes Programm startet. Ist das der Fall, sieht man zwar in der Windows-Taskleiste unten noch den Eintrag, dieser ist aber disabled, bei einem Klick passiert nichts. EnumWindows bzw. EnumTopLevelWindows aus der Unit kann dieses Fenster bzw.Handle nicht finden. Versuche ich das selbe mit FindWindowEx, wird das Handle jedoch erkannt, also ist da auch was da. Kann ich die EnumWindowsUnit irgendwie erweitern, das sie inaktive jedoch laufende Programme bzw. Fenster auch erkennt? So langsam schlaucht mir das echt zu sehr. Wenn die Probleme so weiter gehen, werde ich das wohl doch mit Threads lösen :(. |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Endlich funktioniert mal etwas und liefert mir sogar die passenden Handle zurück. Kann ich das noch irgendwie optimieren?
Delphi-Quellcode:
function TFormMainDlg.getTWHandle: HWND;
var tmpTW: HWND; begin Result := 0; tmpTW := FindWindowEx(0, 0, 'abc', 'xyz'); if (tmpTW = 0) then Exit; if (tmpTW = twH1) then begin tmpTW := FindWindowEx(0, twH1, 'abc', 'xyz'); if (tmpTW = 0) then Exit; if (tmpTW = twH2) then begin tmpTW := FindWindowEx(0, twH2, 'abc', 'xyz'); if (tmpTW = 0) then Exit; Result := tmpTW; Exit; end; if (tmpTW = twH3) then begin tmpTW := FindWindowEx(0, twH3, 'abc', 'xyz'); if (tmpTW = 0) then Exit; Result := tmpTW; Exit; end; end; // analog twH2 und 3 Result := tmpTW; end; |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
ungefähr so insgesamt?
Delphi-Quellcode:
(Ich checkte das mal schnell für drei gleiche NotePad-Aufrufe).
function getTWHandle(twH1,twH2,twH3 : THandle) : THandle;
function checkHandle(hToCheck : THandle) : boolean; begin // muss true sein wenn hToCheck nicht schon in Handle123 registriert ist result := (twH1 <> hToCheck) and (twH2 <> hToCheck) and (twH3 <> hToCheck); end; begin result := 0; repeat result := FindWindowEx(0,result,'Notepad','Unbenannt - Editor'); until (result = 0) or checkHandle(result); end; |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Ok, dann warte ich so lange^^.
Ist es eigentlich egal, ob man THandle oder HWND vereinbart? |
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Ich schrieb "checkte", das ist "past tens", sozusagen auch die Vergangenheitsform des Verbes *g*.
Zitat:
|
Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
Oh, jetzt wo du es sagst, da habe ich doch wirklich das "t" überlesen *g*.
Na dann danke schön für die Optimierung :). |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:11 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