Einzelnen Beitrag anzeigen

Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Wie findet man Fenster, deren Namen man nicht genau kennt?

  Alt 14. Sep 2011, 11:16
Danke Jungs, manchmal reicht einem ein Stichwort damit man weiterkommt In dem Fall CreateToolhelp32Snapshot (übrigens wirklich kein treffender Name für diese Routine). Hier eine Delphi-Übersetzung des Sample-Codes der im PSDK hinterlegt ist:
Delphi-Quellcode:
uses
  tlhelp32;

procedure TForm1.Button1Click(Sender: TObject);
var
  hProcessSnap: THandle;
  hProcess: THandle;
  pe32: PROCESSENTRY32;
  dwPriorityClass: DWord;
begin
  Memo1.Lines.BeginUpdate;
  try
    hProcessSnap:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then begin
      Memo1.Lines.Add(#13#10#13#10'CreateToolhelp32Snapshot (of processes)');
      Exit;
    end;
    pe32.dwSize:= SizeOf(PROCESSENTRY32);

    if not Process32First(hProcessSnap, pe32) then begin
      Memo1.Lines.Add(#13#10#13#10'Error: Process32First');
      CloseHandle(hProcessSnap);
      Exit;
    end;

    repeat
      Memo1.Lines.Add(#13#10'=====================================================');
      Memo1.Lines.Add(Format('PROCESS NAME: %s', [pe32.szExeFile]));
      Memo1.Lines.Add('-----------------------------------------------------');

      dwPriorityClass:= 0;
      hProcess:= OpenProcess(PROCESS_ALL_ACCESS, FALSE, pe32.th32ProcessID);
      if hProcess = NULL then begin
        Memo1.Lines.Add(#13#10'Error: OpenProcess');
      end else begin
        dwPriorityClass:= GetPriorityClass(hProcess);
        if dwPriorityClass = 0 then begin
          Memo1.Lines.Add(#13#10'Error: GetPriorityClass');
          CloseHandle(hProcess);
        end;
      end;

      Memo1.Lines.Add(Format(' Process ID = 0x%08X', [pe32.th32ProcessID]));
      Memo1.Lines.Add(Format(' Thread count = %d', [pe32.cntThreads]));
      Memo1.Lines.Add(Format(' Parent process ID = 0x%08X', [pe32.th32ParentProcessID]));
      Memo1.Lines.Add(Format(' Priority base = %d', [pe32.pcPriClassBase]));
      Memo1.Lines.Add(Format(' Priority base = %d', [pe32.pcPriClassBase]));
      Memo1.Lines.Add(Format(' Executable = %s', [pe32.szExeFile]));

      if dwPriorityClass > 0 then begin
        Memo1.Lines.Add(Format(' Priority class = %d', [dwPriorityClass]));
      end;

    until not Process32Next(hProcessSnap, pe32);

    CloseHandle(hProcessSnap);
  finally
    Memo1.Lines.EndUpdate;
  end;
end;
Ist erstmal nur eine Dummy-Routine mit Ausgabe in ein Memo. Ich werde mir das jetzt so adaptieren dass ich über den Exe-Namen gehe, an die Process-ID eine Message schicke und mir von dort mit einer Message antworten lasse. So finde ich meine ganzen Ziel-Prozesse.
  Mit Zitat antworten Zitat