Entwickler-Ecke

Sonstiges (Delphi) - Feststellen, ob eine weitere Anwendung gestartet wurde


galagher - So 13.02.05 12:38
Titel: Feststellen, ob eine weitere Anwendung gestartet wurde
Hallo!
Wie kann mein Programm feststellen, ob ein weiteres Programm gestartet wurde? Ich meine, mein Programm wird gestartet, stellt fest, wie viele (wenn's geht, auch welche) Programme Windows gerade ausführt, wartet eine vorgegebene Anzahl an Sekunden, bis es sich beendet, wenn aber inzwischen eine weitere Anwendung gestartet wird, soll es sich sofort beenden.

Mein Programm zeigt eine Form mit einer Meldung an, aber ohne Button. Der Text könnte zB. lauten: "Dateien werden kopiert, bitte warten...". In diesem Sinn halt. Geht sowas überhaupt?

//Edit: Ach ja, es sollte auch erkennen können, wenn eine weitere Instanz von ihm selbst gestartet wurde! Danke vorerst!


Hansi@OMG - So 13.02.05 13:41

Zum Thema weitere Instanz, schau dir mal das Thema Mutex an.
Ansonsten könntest du es so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
uses
 tlhelp32;

procedure GetProcessList(const aProcessList: TStrings);
var
  Snap: THandle;
  ProcessE: TProcessEntry32;
begin
  aProcessList.Clear;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  try
    ProcessE.dwSize := SizeOf(ProcessE);
    if Process32First(Snap, ProcessE) then
      Repeat
        aProcessList.Add(ProcessE.szExeFile);
      Until not Process32Next(Snap, ProcessE)
    else
      RaiseLastOSError;
  finally
    CloseHandle(Snap);
  end;
end;

//Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
begin
 GetProcessList(listbox1.Items);
end;

du speicherst dir den listboxcount und machst einen Timer, der die Prozessliste neu erzeugt und wieder den Count vergleicht, ist er um 1 größer machst du ein close.
Das ist doch, was du wolltest, oder?


galagher - So 13.02.05 16:26

Hansi@OMG hat folgendes geschrieben:
Das ist doch, was du wolltest, oder?

Genau das, danke! An Mutex hab' ich auch gedacht, aber damit kann man ja nur Instanzen des den Mutex verwendenden Programms abfragen, so aber klappt's mit jedem Programm!
Nochmals danke!


F34r0fTh3D4rk - So 13.02.05 16:38

wie kann man denn abfangen, ob und welches programm gerade gestartet wurde, also das starten direkt abfangen ?


Hansi@OMG - So 13.02.05 18:46

Es müsste der letzte eintrag in der processlist sein.


Delete - So 13.02.05 18:52

Über einem API Hook und Suche im MSDN CREATEPROCESS hooken. Wie das funktioniert, kannst du dir hier http://www.luckie-online.de/Delphi/Importe/toms/ angucken.