Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm nach x Minuten beenden (https://www.delphipraxis.net/113139-programm-nach-x-minuten-beenden.html)

rollstuhlfahrer 4. Mai 2008 07:09

Re: Programm nach x Minuten beenden
 
mit MSDN-Library durchsuchenProcessFirst MSDN-Library durchsuchenProcessNext kann man ermitteln, welche Kindprozesse es gibt (Prozesse, die von deinem Programmm aus gestartet wurden. Dabei bekommt man aber dann kein Fensterhandle, sondern gleich eine PID.

Delphi-Quellcode:
uses TlHelp32;
type TProcessIds = array of DWORD;

function GetChildrenProcessesID(ParentProcessId: DWORD): TProcessIds;
var
hProcSnap: THandle;
pe32: TProcessEntry32;
begin
Result := nil;
hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0);
if hProcSnap <> INVALID_HANDLE_VALUE then
begin
  pe32.dwSize := SizeOf(ProcessEntry32);
  if Process32First(hProcSnap, pe32) = true then
  begin
    while Process32Next(hProcSnap, pe32) = true do
    begin
      if pe32.th32ParentProcessID = ParentProcessId then
      begin
        SetLength(Result, Length(Result) + 1);
        Result[Length(Result) - 1] := pe32.th32ProcessID;
      end;
    end;
  end;
CloseHandle(hProcSnap);
end;
end;

// Aufruf
procedure TForm1.Button3Click(Sender: TObject);
var Children: TProcessIds;
    i: integer;
begin
  ListBox1.Clear;
  Children := GetChildrenProcessesID(GetCurrentProcessId); // Eigene Kinder finden
  for i := 0 to Length(Children) - 1 do
    ListBox1.Items.Add(IntToStr(Children[i]));
end;
rollstuhlfahrer

marabu 4. Mai 2008 08:24

Re: Programm nach x Minuten beenden
 
Wieso muss denn nach einem Prozess gesucht werden? Wenn die URL per ShellExecuteEx() geöffnet wurde, dann wird das process handle zurückgeliefert, genauso die Information, ob eine eigene Instanz des Browsers gestartet wurde oder nicht.

Delphi08 4. Mai 2008 18:33

Re: Programm nach x Minuten beenden
 
Zitat:

Zitat von marabu
Wieso muss denn nach einem Prozess gesucht werden? Wenn die URL per ShellExecuteEx() geöffnet wurde, dann wird das process handle zurückgeliefert, genauso die Information, ob eine eigene Instanz des Browsers gestartet wurde oder nicht.

wie würdest du es dann machen?!

mfg

mkinzler 4. Mai 2008 18:36

Re: Programm nach x Minuten beenden
 
Er meint, dass wenn du den PID schon kennst, ihn nicht über den Klassennamen ermitteln musst

DeddyH 4. Mai 2008 18:37

Re: Programm nach x Minuten beenden
 
Richtig, und dann könnte man den Code aus #10 verwenden.

Delphi08 4. Mai 2008 18:47

Re: Programm nach x Minuten beenden
 
okay ich hab wieder den Code aus #10

allerdings funktioniert nur WM_CLOSE allerdings nicht
Zitat:

WM_CLOSE_QUERY
(was ist eigentlich der Unterschied)?
Die PID ändert sich doch jedes mal, oder nicht?

hab testweise mal die Funktion so aufgerufen:
Delphi-Quellcode:
CloseProcessWindows(3992);
(funktioniert auch, aber da kann ich ja ned 3992 stehen lassen, oder?)

Larsi 4. Mai 2008 20:04

Re: Programm nach x Minuten beenden
 
Also hier nochmal die Komplettlösung:
Du ziehst eine Timer Komponente auf dein Formular, stellst den Interval im Objektinspektor auf die Millisekunden, nachdehnen es beendet werden soll ein, und in dann klickst du auf die Timer Komponente doppelt drauf und schreibst dort: Form3.Close; rein. Fals es bei dir nicht Form3 ist dann nehm einfach statt drei die Zahl deines Formulares ein. Das war jetzt eine Lösung wie du dein Programm beendest. Das mit z.B. Firefox würde ich so machen: Du schreibst folgenden Code in dein Formular:
Delphi-Quellcode:
function KillTask(ExeFileName: string): integer;
const
  PROCESS_TERMINATE=$0001;
var
  ContinueLoop: BOOL;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  result := 0;

  FSnapshotHandle := CreateToolhelp32Snapshot
                     (TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle,
                                 FProcessEntry32);

  while integer(ContinueLoop) <> 0 do
  begin
    if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
         UpperCase(ExeFileName))
     or (UpperCase(FProcessEntry32.szExeFile) =
         UpperCase(ExeFileName))) then
      Result := Integer(TerminateProcess(OpenProcess( 
                        PROCESS_TERMINATE, BOOL(0),
                        FProcessEntry32.th32ProcessID), 0));
    ContinueLoop := Process32Next(FSnapshotHandle,
                                  FProcessEntry32);
  end;

  CloseHandle(FSnapshotHandle);
end;
Oben in dies Uses- Klause schreibst du dann noch ,tlhelp32 rein. In deinen Timer wo schon das FormX.close drinnensteht schreibst du dann noch KillTast('firefox.exe'); rein und dieser wird dann mit deinem Programm nach der angegebenen Zeit beendet.

Sonst noch Fragen^^


MFG Lars Wiltfang

mkinzler 4. Mai 2008 20:08

Re: Programm nach x Minuten beenden
 
Er startet aber Firefox und kennt deshalb dessen PID! Dein Code schliesst auch eine eventuell andere Firefox-Instanz

DeddyH 5. Mai 2008 08:06

Re: Programm nach x Minuten beenden
 
Das hab ich in #20 ja bereits angedeutet.

mkinzler 5. Mai 2008 08:07

Re: Programm nach x Minuten beenden
 
Ich weiss; es gibt aber andere die den thread wohl nicht ganz gelesen haben


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:39 Uhr.
Seite 3 von 4     123 4      

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