![]() |
Programm nach x Minuten beenden
Hey!
Ich suche eine Möglichkeit mein Programm nach 15 Minuten zu beenden. Weiß denn da einer weiter? Ist es auch möglich ein Programm, dass ich mit meinem gestartet hab dann ebenfalls mit zu beenden?! Danke! PS: Blutiger Anfänger :lol: |
Re: Programm nach x Minuten beenden
Sollte mit einem Timer gehen.
Wenn du die PID des gestateten Programmes kennst |
Re: Programm nach x Minuten beenden
könntest du dies vielleicht genauer erklären :)
Hab jetzt mal in google gesucht, aber nicht passendes gefunden. :( |
Re: Programm nach x Minuten beenden
Welchen Teil meinst du?
|
Re: Programm nach x Minuten beenden
Den Teil mit dem Timer.
Also ich muss einen erstellen, aber wie sieht dann die "Funktion" aus? Also der Quellcode. |
Re: Programm nach x Minuten beenden
Du legst dir einen Timer auf die Form stellst die Zeit auf 15 Minuten ( 15*60*1000) und fügst in .OnTimer den Code zum Beenden ein.
|
Re: Programm nach x Minuten beenden
Hi,
geht es um eine Uhrzeit (15 Minuten später) oder soll das Programm maximal 15 Minuten (crippleware) benutzbar sein? Da in meinen Programmen fast immer ApplicationEvents bearbeitet werden, brauche ich keinen TTimer:
Delphi-Quellcode:
Freundliche Grüße
type
TDemoForm = class(TForm) ApplicationEvents: TApplicationEvents; procedure ApplicationEventsActivate(Sender: TObject); procedure ApplicationEventsDeactivate(Sender: TObject); procedure ApplicationEventsIdle(Sender: TObject; var Done: Boolean); private Timer: TDateTime; end; var DemoForm: TDemoForm; implementation {$R *.dfm} uses DateUtils; procedure TDemoForm.ApplicationEventsActivate(Sender: TObject); begin Timer := Now - Timer; end; procedure TDemoForm.ApplicationEventsDeactivate(Sender: TObject); begin Timer := Now - Timer; end; procedure TDemoForm.ApplicationEventsIdle(Sender: TObject; var Done: Boolean); begin Done := Application.Active and ((Now - Timer) >= (15 * OneMinute)); if Done then Close; end; |
Re: Programm nach x Minuten beenden
@mkinzler: Dank dir ;)
Ja das Programm soll einfach nur 15 min etwas anzeigen und danach soll es sich beenden. jetzt muss ich nur noch wissen wie ich zb. Firefox mit beende, diesen hab ich aus meinem Programm raus mitgestartet. |
Re: Programm nach x Minuten beenden
Such mal nach
![]() |
Re: Programm nach x Minuten beenden
Hab in diesem Thread
![]()
Delphi-Quellcode:
weiß aber leider damit kaum was anzufangen... -> armer Anfänger :(
procedure CloseProcessWindows(const AProcessID: DWord);
function CloseWindowsCB(AHandle :HWND; AProcessID: DWord): LongBool; stdcall; var myProcessID: DWord; begin GetWindowThreadProcessId(AHandle, @myProcessID); // compare process id of AHandle against AProcessID if myProcessID=AProcessID then PostMessage(AHandle, WM_CLOSE, 0, 0); Result:= True; end; begin EnumWindows(@CloseWindowsCB, AProcessID); end; |
Re: Programm nach x Minuten beenden
Die Prozedur schließt einen Prozess mit einer bestimmten PID.
|
Re: Programm nach x Minuten beenden
ja, dass wusste ich (dachte ich zumindest^^).
Schließt die das Programm, wenn meins geschlossen wird? Oder wie funktioniert dass? Wie übegeb ich ihm die PID von Firefox, also wo muss ich die reinschreiben? Sorry für die ganzen dummen Fragen, aber ich hab es noch ned lang mit programmieren zu tun :roll: Danke! |
Re: Programm nach x Minuten beenden
Delphi-Quellcode:
procedure CloseProcessWindows(const AProcessID: DWord); <-- AProcessID = PID
|
Re: Programm nach x Minuten beenden
okay hab es nun mal getestet, es funktioniert, ist aber eine sehr unsaubere Art Firefox oder ähnliches zu schließen.
Gibt es da noch was "schöneres"? mfg |
Re: Programm nach x Minuten beenden
TerminateProcess wäre unsauber. Wenn du die PID dynamisch ermittelst, ist mit der oben gezeigten Methode alles in Ordnung.
|
Re: Programm nach x Minuten beenden
Nimm WM_CLOSE_QUERY statt WM_CLOSE
|
Re: Programm nach x Minuten beenden
Diese Nachricht existiert nicht.
|
Re: Programm nach x Minuten beenden
Die PN des Threaderstellers beantworte ich öffentlich, damit andere auch noch etwas davon haben.
Am besten sucht man ein Fenster mit bekanntem Titel oder bekanntem Klassennamen und erhält dann mit GetWindowThreadProcessId die gewünschte PID. Den Klassennamen eines Fensters erhält man zum Beispiel mit ![]() |
Re: Programm nach x Minuten beenden
Zitat:
Okay ich hab nun den "Klassennamen"? von Firefox "MozillaUIWindowClass" oder? Aber was mache ich mit diesem? |
Re: Programm nach x Minuten beenden
Das Problem ist dabei aber, dass man nicht weiß, ob es sich bei der gefundenen Instanz wirklich um die von einem selbst gestartete handelt.
|
Re: Programm nach x Minuten beenden
mit
![]() ![]()
Delphi-Quellcode:
rollstuhlfahrer
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; |
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.
|
Re: Programm nach x Minuten beenden
Zitat:
mfg |
Re: Programm nach x Minuten beenden
Er meint, dass wenn du den PID schon kennst, ihn nicht über den Klassennamen ermitteln musst
|
Re: Programm nach x Minuten beenden
Richtig, und dann könnte man den Code aus #10 verwenden.
|
Re: Programm nach x Minuten beenden
okay ich hab wieder den Code aus #10
allerdings funktioniert nur WM_CLOSE allerdings nicht Zitat:
Die PID ändert sich doch jedes mal, oder nicht? hab testweise mal die Funktion so aufgerufen:
Delphi-Quellcode:
(funktioniert auch, aber da kann ich ja ned 3992 stehen lassen, oder?)
CloseProcessWindows(3992);
|
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:
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.
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; Sonst noch Fragen^^ MFG Lars Wiltfang |
Re: Programm nach x Minuten beenden
Er startet aber Firefox und kennt deshalb dessen PID! Dein Code schliesst auch eine eventuell andere Firefox-Instanz
|
Re: Programm nach x Minuten beenden
Das hab ich in #20 ja bereits angedeutet.
|
Re: Programm nach x Minuten beenden
Ich weiss; es gibt aber andere die den thread wohl nicht ganz gelesen haben
|
Re: Programm nach x Minuten beenden
okay danke ;)
Delphi-Quellcode:
entweder bin ich zu blöd oder sonst was, aber er meint "undef. Bezeichner killtask".
procedure TForm1.exit(Sender: TObject);
begin Killtask('firefox.exe'); Form1.Close; end; Wenn es außerhalb der Prozedur steht, ist es kein Problem. Aber innerhalb wohl schon :-/ |
Re: Programm nach x Minuten beenden
Die Procedur die "erklärt" was KillTask ist steht vielleicht im Quelltext UNTER dem Timer Event? Schreib die mal weiter nach oben also direkt unter dieses {SR.blabla} oder wie das heißt :)
|
Re: Programm nach x Minuten beenden
ah okay!
Vielen Dank nochmal an alle dir mir hier helfen konnten ;) Anfängerfehler :oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
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