Entwickler-Ecke

Windows API - Automatisches Beenden von best. Programmen


andras - Mi 08.02.06 16:11
Titel: Automatisches Beenden von best. Programmen
hallo!
ich hab folgendes problem:
ich möchte ein prog schreiben, mit dem manbestimmte programme auf eine blacklist setzen kann und wenn diese dann gestartet werden, sollen sie sofort geschlossen werde.
Das geleiche sollte dann auch mit bestimmten verzeichnissen funktionieren.
mein problem ist, dass ich nicht weiß wie ich das prog, das läuft ermittle, und wie ich eine fremde anwendung schließen kann.
kann midt da wer helfen??
danke schon im voraus!!


Marco D. - Mi 08.02.06 16:33


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:
29:
30:
31:
32:
Mit folgendem Code kann geprüft werden, ob eine Exe-Datei läuft. Über Die TProcessEntry32-Struktur kann auch gleich ein Handle auf den Prozess ermittelt werden. Nähere Informationen im PSDK unter dem Stichwort ProcessEntry32.

uses TlHelp32;

function IsExeRunning(const AExeName: string): boolean;
var
  h: THandle;
  p: TProcessEntry32;
begin
  Result := False;

  p.dwSize := SizeOf(p);
  h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    Process32First(h, p);
    repeat
      Result := AnsiUpperCase(AExeName) = AnsiUpperCase(p.szExeFile);
    until Result or (not Process32Next(h, p));
  finally
    CloseHandle(h);
  end;
end;
Beispielaufruf

procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsExeRunning('Notepad.exe'then
   ShowMessage('Notepad läuft')
 else
   ShowMessage('Notepad läuft nicht');
end;
Es wird dabei nur überprüft, ob eine Anwendung mit dem gleichen Dateinamen läuft. Es spielt keine Rolle in welchem Verzeichnis sich die Anwendung befindet. Aus diesem Grund muss der Funktion auch nur der Dateiname der EXE-Datei übergeben werden.



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:
29:
30:
31:
32:
33:
34:
35:
Die Funktion beendet den Prozess, der mit übergebenen Exenamen übereinstimmt. Sollten mehrere Prozesse des selben Exenamens laufen, so wird der zuerst Gefundene geschlossen.

Wenn der Prozess erfolgreich beendet wurde, wird true zurückgegeben.

uses TLHelp32;

function KillTask(const AExeName: string): boolean;
var
  p: TProcessEntry32;
  h: THandle;
begin
  Result := false;
  p.dwSize := SizeOf(p);
  h := CreateToolHelp32Snapshot(TH32CS_SnapProcess, 0);
  try
    if Process32First(h, p) then
      repeat
        if AnsiLowerCase(p.szExeFile) = AnsiLowerCase(AExeName) then
          Result := TerminateProcess(OpenProcess(Process_Terminate,
                                                 false,
                                                 p.th32ProcessID),
                                     0);
      until (not Process32Next(h, p)) or Result;
  finally
    CloseHandle(h);
  end;
end;

//Aufruf
procedure TForm1.Button2Click(Sender: TObject);
begin
  if not KillTask('Project2.exe'then
    Showmessage('Prozess konnte nicht beendet werden.');
end;
Bei diesem Code wird der Prozess ohne Rückfrage beendet. Dadurch kann es ggf. zu Datenverlusten kommen.


Beide Quellcodes sind dem EasyHelper entnommen.


andras - Mi 08.02.06 16:41

vielen, vielen dank!!!!!