Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi PID eines prozesses merken, Anwendung ähnlich Taskleiste (https://www.delphipraxis.net/137926-pid-eines-prozesses-merken-anwendung-aehnlich-taskleiste.html)

LokutusvB 5. Aug 2009 07:58

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.

DeddyH 5. Aug 2009 08:11

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
 
Spontan fällt mir da MSDN-Library durchsuchenEnumWindows ein.

LokutusvB 5. Aug 2009 08:51

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
 
Danke, zusätzlich konnte ich noch EnumWindows & Co gekapselt finden. Das sollte weiter helfen.

LokutusvB 5. Aug 2009 10:05

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.

LokutusvB 5. Aug 2009 14:15

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 :(.

LokutusvB 6. Aug 2009 10:54

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;

r29d43 6. Aug 2009 12:21

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
 
ungefähr so insgesamt?

Delphi-Quellcode:
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;
(Ich checkte das mal schnell für drei gleiche NotePad-Aufrufe).

LokutusvB 6. Aug 2009 12:36

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
 
Ok, dann warte ich so lange^^.

Ist es eigentlich egal, ob man THandle oder HWND vereinbart?

r29d43 6. Aug 2009 12:46

Re: PID eines prozesses merken, Anwendung ähnlich Taskleiste
 
Ich schrieb "checkte", das ist "past tens", sozusagen auch die Vergangenheitsform des Verbes *g*.


Zitat:

Zitat von LokutusvB
Ist es eigentlich egal, ob man THandle oder HWND vereinbart?

imo müsste das eigentlich egal sein.

LokutusvB 6. Aug 2009 12:52

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.
Seite 2 von 3     12 3      

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