Win-Prozesse überwachen

Hallo!

Bei meinen gelegentlichen, meist etwas kranken :wink: Ideen, was man so programmieren könnte, stieß ich mal wieder auf ein „Problem“. Ich wollte in diesem Programm überprüfen, ob ein Prozess der unter Windows gestartet wurde noch immer läuft oder beendet wurde. Dabei ist das einzige, was mir bekannt ist, der Name der Executable. Das Prinzip wäre ja ganz einfach, wenn man die ProzessID(o.ä.) herausbekommen würde und dann überprüfen könnte, ob diese noch vergeben ist.

Vielen Dank
Hagen

Hallo Hagen

Dein Vorhaben ist nicht einfach. Du benötigst viel Kenntnisse bei den WinAPI’s. Ich hab mal sowas ähnliches gemacht. Kannste dir mal ansehen, weil OpenSource:

http://www.hinterwaeldlers-home.de/html/shell4upx.html

der Hinterwäldler

Hallo Hagen

Dein Vorhaben ist nicht einfach. Du benötigst viel Kenntnisse bei den WinAPI’s.

Genau die fehlen mir :wink:

Ich hab mal sowas ähnliches gemacht. Kannste
dir mal ansehen, weil OpenSource:

Danke für die Quellen. Ich meine das, was du da gemacht hast nachvollziehen zu können. Trotzdem denke ich, dass du mich nicht genau verstanden hattest oder ich einfach nicht genau hingesehen habe. Ich wollte nicht wissen, wie man ein externes Programm in einer Anwendung startet und dann überwacht. Ich meinte wie ich feststellen kann, ob eine Anwendung noch läuft, die vollkommen unabhängig von meiner Anwendung (also zum Beispiel auch vor meiner) gestartet wurde.

Also als praktisches Beispiel eine Protokollierung des Taskmanagers erstellen oder etwas in der Art.
Sollte dies in deinenm Beispiel doch schon enthalten sein, bitte ich um Nachsicht.

Hallo Hagen,

ist gar keine so kranke Idee. Hab ich auch schon gemacht.

Diese Procedure screibt alle Prozesse in ein TListView:

procedure TMainForm.RefreshProcessList;
var
i: Integer;
Ignore: Boolean;
Item: TListItem;
ModuleCount: Cardinal;
Modules: array[0…512] of DWord;
Process: THandle;
ProcessName: array[0…512] of Char;
ProcessNameStr: string;
Processes: array[0…512] of DWord;
Used: Cardinal;
begin
lstProcesses.Items.Clear;
Win32Check(EnumProcesses(@Processes[0], sizeof(Processes), Used));
for i := 0 to (Used div sizeof(DWord)) - 1 do begin
Ignore := False;
Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
False, Processes[i]);
if Process = 0 then begin
ProcessNameStr := ‚unknown‘;
end else begin
try
Win32Check(EnumProcessModules(Process, @Modules[0], sizeof(Modules[0]),
ModuleCount));
GetModuleBaseName(Process, Modules[0], ProcessName,
sizeof(ProcessName));
ProcessNameStr := string(ProcessName);
CloseHandle(Process);
except
CloseHandle(Process);
Ignore := True;
end;
end;
if not Ignore then begin
Item := lstProcesses.Items.Add;
Item.Caption := ProcessNameStr;
Item.SubItems.Add(IntToStr(Processes[i]));
end;
end;
end;

Und nun schaun wir mal ob IE noch läuft, wenn ja kill ihn!

procedure TMainForm.killIexplore;
var
i: Integer;
Process: THandle;
ProcessId: DWord;
begin
RefreshProcessList;
Application.ProcessMessages;

for i := lstProcesses.Items.Count -1 downto 0 do
begin
// lstProcesses: TListView;
if UpperCase(lstProcesses.Items.Item[i].Caption) = ‚IEXPLORE.EXE‘ Then
begin
ProcessId := StrToInt(lstProcesses.Items.Item[i].SubItems[0]);
Process := OpenProcess(PROCESS_TERMINATE, False, ProcessId);
if Process = 0 then exit;
TerminateProcess(Process, 1);
CloseHandle(Process);
end;
end;
end;

Übrigens muss man nicht unbedingt ein TListView benutzen, man kann aber schön alle Prozesse sehen.

Viele Grüße
Manfred

Klasse das funktioniert, Nachdem Ich dann noch die psAPI eingebunden hatte hat es auch endlich funktioniert. RECHT HERZLICHEN DANK!

Viele Grüsse
Hagen