Einzelnen Beitrag anzeigen

Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#10

Re: FensterHandle über den Prozess ermitteln

  Alt 13. Apr 2009, 21:34
Also bei Delphi 5 gibt es die Unit TlHelp32, mit der sich ein Schnappschuss der Prozesse machen lässt. Aus dem Schnappschuß kann man dann Prozesse und deren Exe-Namen ermitteln. Natürlich auch die zugehörigen Fenster, aber ersters könnte ja schon reichen.

Hier mal ein Ausschnitt aus meinem Quellcode, denke das sollte fast schon reichen
Delphi-Quellcode:
uses TlHelp32, ShellApi;

var
  Handle : THandle;
  Continue : boolean;
  ProcEntry : TProcessEntry32;
  i : Integer;
begin
  i := 0;
  Handle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
  ProcEntry.dwSize := Sizeof(ProcEntry);

  // gehe alle Prozesse durch (m.H. der TlHelp32 - Unit)
  Continue := Process32First(Handle, ProcEntry);

  while Continue do begin

    SetLength(TaskListe,i +1);

    // Daten zum Prozess ermitteln
    ProcID := ProcEntry.th32ProcessID;
    Threads := ProcEntry.cntThreads;
    ExeFile := ProcEntry.szExeFile;
    if ExeFile = '[System Process]then
      ExeFile := 'Leerlaufprozess';

    // Nächster Prozess
    Continue := Process32Next(Handle, ProcEntry);
    inc(i);
  end;
  CloseHandle(Handle);
zum Fenster durchlaufen mal der Ausschnitt:
Delphi-Quellcode:
var
  Current : hwnd;
  i : Integer;
begin
  // Erstes Fenster holen
  i := 0;
  Current := GetTopWindow(GetDesktopWindow);

  while Current <> 0 do begin

    // Daten zum Fenster ermitteln
    visible := IsWindowVisible(Current);
    iconic := IsIconic(Current);
    handle := Current;
    parent := GetParent(Current);
    GetWindowThreadProcessID(Current, ProcID);
    GetWindowText(Current, Titel, 255);
    GetClassName(Current, Klasse, 255);

    // Nächstes Fenster
    Current := GetNextWindow(Current,GW_HWNDNEXT);
    inc(i);
  end;
end;
Die hier erhaltenen Informationen (z.B. ProcID) kann man mit der Information aus dem vorherigen Beispiel verknüpfen.

Die Variablen, auf die zugewiesen wird, sehen im Beispiel sinnlos aus. Das liegt daran, das ich den Code aus einem Programm ausgeschnitten hab' (da wird auf ein dyn. Record-Array zugewiesen)
  Mit Zitat antworten Zitat