Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi ProzessID: Alle Fenster auflisten (https://www.delphipraxis.net/42661-prozessid-alle-fenster-auflisten.html)

phXql 22. Mär 2005 09:29


ProzessID: Alle Fenster auflisten
 
Moin leute. Habe folgendes Problem:

ich hab mit CreateProcess ein Programm gestartet, und hab von diesem auch die ProzessID. Nun möchte ich das Programm wieder "normal" beenden. Da icj mit SendMessage aber nur an Fensterhandles die WM_CLOSE nachricht senden kann, muss ich nun von der ProzessID auf die Fensterhandles kommen. Ist das irgendwie möglich? Oder gibt es noch eine andere Methode, diesen Prozess anders sanft zu beenden?

// Edit: ich habe WEDER den Fenstertitel noch den Classnamen, da der Programmpfad vom Benutzer eingestellt werden kann. Alles was ich hab, ist die ProcessID und den EXE-Pfad.

mfg phXql

Sprint 22. Mär 2005 13:09

Re: ProzessID: Alle Fenster auflisten
 
EnumWindows. Ergebnis mit GetWindowThreadProcessId vergleichen.

idontwantaname 22. Mär 2005 13:35

Re: ProzessID: Alle Fenster auflisten
 
diese funktion sollte genau das sein, was du brauchst
Delphi-Quellcode:
function StartProgram(Filename: String): HWND;

  function EnumWindowsProc(hWnd: HWND; lParam: LPARAM): BOOL; stdcall;
  begin
    TList(lParam).Add(Pointer(hWnd));
    Result := True;
  end;

var
  SI: TStartupInfo;
  PI: TProcessInformation;
  List: TList;
  ProcessId: DWORD;
  I: Integer;
  myHWND: HWND;
begin
  Result := 0;
  myHWND := 0;

  FillChar(SI, SizeOf(TStartupInfo), 0);
  SI.cb := SizeOf(TStartupInfo);
  SI.dwFlags := STARTF_USESHOWWINDOW;
  SI.wShowWindow := SW_SHOW;

  if CreateProcess(nil, PChar(Filename), nil, nil, False, 0, nil, nil, SI, PI) then
  begin
    WaitForInputIdle(PI.hProcess, INFINITE);
    CloseHandle(PI.hProcess);
    CloseHandle(PI.hThread);
    List := TList.Create;
    try
      if EnumWindows(@EnumWindowsProc, Longint(List)) then
      begin
        for I := 0 to List.Count - 1 do
          if GetWindowThreadProcessId(HWND(List.Items[I]), @ProcessId) <> 0 then
            if ProcessId = PI.dwProcessId then
            begin
              myHWND := HWND(List.Items[I]);
              Break;
            end;
        if IsWindow(myHWND) then
        begin
          Result := myHWND;
        end;
      end;
    finally
      List.Free;
    end;
  end;
end;

phXql 22. Mär 2005 16:24

Re: ProzessID: Alle Fenster auflisten
 
Zitat:

Zitat von Sprint
EnumWindows. Ergebnis mit GetWindowThreadProcessId vergleichen.

danke, bin auf diese lösung dann selbst gekommen. Kann den kompletten code morgen mal posten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:33 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz