![]() |
Test-Programm
Hi waollte mal fragen ob es ein Programm gibt das uz.b alle 5 min testen ob ein anderes programm am laufen ist und falls nicht das Programm starten kann
bsp es lauft "sol.exe"(dumm ich weis) das Programm soll dann alle 5 min testen o sol.exe lauft wenn nein soll sol.exe gestarten werde kann mir das jmd sagen oder vlt sogar geben danke |
Re: Test-Programm
Hi,
suchst oder willst solch ein Programm machen? :gruebel: MfG Marc |
Re: Test-Programm
|
Re: Test-Programm
Also... :roll:
![]() ![]() Und für den Rest reicht ein Timer... Greetz Sergej |
Re: Test-Programm
Delphi-Quellcode:
Erst mal danke an alle die mir Antwort gaben
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, tlhelp32, ShellAPI, ExtCtrls, AppEvnts; const IC_CLICK = WM_APP + 201; type TForm1 = class(TForm) Label1: TLabel; Timer1: TTimer; ApplicationEvents1: TApplicationEvents; procedure ApplicationEvents1Minimize(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure Timer1Timer(Sender: TObject); private { Private-Deklarationen } procedure Systray(var sMsg: TMessage); message IC_CLICK; public { Public-Deklarationen } end; var Form1: TForm1; NIM : TNotifyIconData; implementation {$R *.dfm} var bclose : boolean; function GetProcessID(Exename: string): DWORD; var hProcSnap: THandle; pe32: TProcessEntry32; begin result := 0; 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 pos(Exename, pe32.szExeFile) <> 0 then result := pe32.th32ProcessID; end; end; CloseHandle(hProcSnap); end; end; function GetProcessHandleFromID(ID: DWORD): THandle; begin result := OpenProcess(SYNCHRONIZE, False, ID); CloseHandle(result); end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin bClose := True; end; procedure TForm1.Systray(var sMsg: TMessage); begin inherited; if (sMsg.LParam = WM_LBUTTONDOWN) then begin Show; Shell_NotifyIcon(NIM_DELETE, @NIM); Application.Restore; end; end; procedure TForm1.ApplicationEvents1Minimize(Sender: TObject); begin Form1.FormStyle:=fsStayOnTop; Hide; with NIM do begin cbSize := SizeOf (nIM); Wnd := Handle; uID := 0; uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP; uCallbackMessage := IC_CLICK; hIcon := Application.Icon.Handle; szTip := 'Network'; end; Shell_NotifyIcon(NIM_ADD, @NIM); end; procedure TForm1.Timer1Timer(Sender: TObject); var hProcess: THandle; wf: DWORD; begin bClose := False; while bClose = False do begin hProcess := GetProcessHandleFromID(GetProcessID('notepad.exe')); if hProcess = 0 then winexec(pchar('notepad.exe'),sw_shownormal) else label1.caption := 'Bereits offen'; Application.HandleMessage; end; end; end. Habe bei dem obigen Quellcode noch ein Problem wenn ich das Programm satrte wenn es aus war versucht der Timmer das programm immer wieder neu zu öffnen also hab ich nachher zichtausend fenster offen kann man das irgendwie ausschalten also wenn das Programm laüft mach nix öffnen?? |
Re: Test-Programm
Zitat:
|
Re: Test-Programm
Also ich kann nicht erkennen wieso er ein Programmm mehrmals öffnet
Weis ich auch net kapiere ist wenn das programm geschlossen wird warum direkt es dirket wieder geöffnet wird also normalerweise dürfte er wes erst nach der zeit wieder öffnen oder kannman das mit mner abfrage machen wenn es schon offen ist dann mache das testen net kann mir jmd helfen?? |
Re: Test-Programm
Also ich versteh beim besten willen nicht was du willst!
Der Code den du hast überprüft in einem Interval das du im Timer einstellen kannst ob dein Notepad läuft. Wenn es nicht läuft wird es geöffnet und das ist ja genau das was du wolltest, oder? Und wenn nicht, was willst du denn dann überhaupt? :gruebel: |
Re: Test-Programm
Genau das will ich das macht es auch aber wenn es auf ist macht genau dieser Code das Programm nochmal und nochmal und nochmal... auf das will cih nicht ich will wenn das Programm nicht läuft das Program 1 einziges mal starten nicht so oft das Intervall erreicht wird
Beispiel Inetervall: 5 sec Programmstatus: aus So das Programm testet nun nach 5 sec ob notepad läuft (nein) so nun soll es notepade öffnen (macht es) 5 sec Später das programm öffnet notepad wieder (es ist aber schon offen) 5 sec Später das programm öffnet notepad wieder (es ist aber schon 2x offen) 5 sec Später das programm öffnet notepad wieder (es ist aber schon 3x offen) .... Dort liegt der Fehler |
Re: Test-Programm
Hmm...
Das Programm das ich aus deinem Code nachgebaut habe fuktioniert. Ich kann mir das nicht recht erklähren. Könnte es sein das der Prozess nicht notepad.exe heißt sondern vielleicht NOTEPAD.EXE? Das ist mir nämlich mal untergekommen. Ansonsten könntest du einfach mal dein Projekt Anhängen und ich teste es mal bei mir. |
Re: Test-Programm
der Code ist mein Projekt ich wollte nur dies ereichen ich werde mal genau den Genauen Pfad angeben und auf groß und klien schreibung achten
|
Re: Test-Programm
sry für den Doppelpost wollte das man das aktualisierte besser sieht
Also ich habe mir mal gedanken gemacht und ich denke das Problem ist gelöst
Delphi-Quellcode:
habe mal den Timmer deaktiviert wenn das programm an ist erst wenn es aus ist wird er wieder akriv :hello: :party:
procedure TForm1.Timer1Timer(Sender: TObject);
var hProcess: THandle; wf: DWORD; begin bClose := False; while bClose = False do begin hProcess := GetProcessHandleFromID(GetProcessID('C:\Programme\TightVNC\WinVNC.exe')); if hProcess = 0 then begin [b]Timer1.enabled := false;[/b] winexec(pchar('C:\Programme\TightVNC\WinVNC.exe'),sw_shownormal); end else [b] Timer1.enabled := true;[/b] Application.HandleMessage; end; |
Re: Test-Programm
So habe dann noch ne frgae wie bekomme ich das Programm in die Regetry so dass es automatisch bei Windowsstart geladen wird??
|
Re: Test-Programm
Siehe:
![]() |
Re: Test-Programm
Zitat:
Z.B Project1.exe oder c:\Projekt1.exe |
Re: Test-Programm
Soweit ich das sehe ist das nur eine Beschreibung da der Komplette Pfad ja mit ParamStr(0) als Wert eingetragen wird.
Project1.exe würde also reichen. P.S.: Wie war das noch gleich mit: "Neue Frage - neuer Thread"? |
Re: Test-Programm
gehört aber noch zu dem obigen Programm daher nix neues wollen aufmachen
Also nur Programmname DANKE :thumb: |
Re: Test-Programm
Wäre es nicht am einfachsten, wenn dein "Watchdog" auch den überwachten Prozeß direkt startet? Somit wäre ein Handle vorhanden und der Watchdog könnte über eine der Wait*-Funktionen warten. Wenn du das in einer Schleife machst, wird der Prozeß immer wieder neu gestartet.
Abgesehen davon ist WinExec() "deprecated" und deine Timer1-Methode hoch ineffektiv. Aber jedem das seine :roll: Desweiteren ist die Funktion GetProcessID() abgesehen von der Inkompatibilität zu Windows NT 4 nicht generisch funktionsfähig! Leider ist der Puffer nicht groß genug um beliebige EXE-Namen zu halten. Wenn also ein zu langer Name gesucht wird, so wird er nicht gefunden, weil der Puffer zB schon bei ".e" statt ".exe" aufhört. |
Re: Test-Programm
Sehr schon das mir das jmd sagt Dsnke dir Olli :cheers:
Kann man das irgendwie verbessern so das es effektiver ist?? Und gibt es eine besser Fucntcion als GetProcessID() ?? Danke für diese gute Hilfe |
Re: Test-Programm
Zitat:
Statt WinExec kannst du dann zB ![]() ![]() Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:45 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