Autor Beitrag
hitstec
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 295



BeitragVerfasst: Do 18.07.02 14:44 
Also zunächst einmal unterstützt nur die Windows-Reihe 9x dieses Feature. In allen anderen Windows-Systemen ist diese Funktion nicht implementiert.

Der Api-Aufrauf namens "RegisterServiceProcess" aus KERNEL32.DLL lässt die eigene Anwendung aus dem Taskmanager verschwinden.

Binden wir diese Funktion statisch in das eigene Programm, so wird es zwar auf WIN9x wunderbar funktionieren, auf allen anderen Systemen kommt es aber ungewollt zu einer Fehlermeldung.

Um diese Funktion trotzdem in die eigene Anwednung zu implemntieren, ohne eine Fehlermeldung zu generieren, prüfen wir nach dem Programmstart, ob es sich beim aktuellen Betriebssystem um ein WIN9x handelt. Wenn ja, so wird die Funktion "RegisterServiceProcess" dynamisch in unser Programm eingebunden und ausgeführt, wenn nicht, dann passiert gar nichts.

Und nun der Code:

ausblenden 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:
uses Windows, ...
.
.
type
.
TRegisterService=function(iPID,iTyp: DWord): DWord; stdcall;
.
.
.
function HideFromTaskmanager(): Bool;
var rsFunct: TRegisterService; iLib: Cardinal; verSystem: TOSVersionInfo;
begin
  verSystem.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  GetVersionEx(verSystem);
  if verSystem.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then begin
   iLib:=LoadLibrary('KERNEL32.DLL');
   if iLib<>INVALID_HANDLE_VALUE then rsFunct:=GetProcAddress(iLib,'RegisterServiceProcess');
   rsFunct(GetCurrentProcessID,1);
   result:=true;
  end else result:=false;
end;
.
.
procedure TForm1.FormCreate(Sender: TObject);
begin
  HideFromTaskmanager();
end;

Es ist auch möglich das ganze sofort beim Start der Anwendung durchzuführen und nicht erst beim OnCreate-Ereignis des Formulars.

Dazu öffnet man die *.dpr-Datei des Projekts, also nicht die Unit, sondern die zum Bsp. Project1.exe, indem man den Quelltext anzeigen lässt. Der könnte dann schließlich so aussehen:

ausblenden 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:
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {Form1};

type
  TRegisterService=function(iPID,iTyp: DWord): DWord; stdcall;

{$R *.RES}

function HideFromTaskmanager(): Bool;
var rsFunct: TRegisterService; iLib: Cardinal; verSystem: TOSVersionInfo;
begin
  verSystem.dwOSVersionInfoSize:=SizeOf(TOSVersionInfo);
  GetVersionEx(verSystem);
  if verSystem.dwPlatformId=VER_PLATFORM_WIN32_WINDOWS then begin
   iLib:=LoadLibrary('KERNEL32.DLL');
   if iLib<>INVALID_HANDLE_VALUE then rsFunct:=GetProcAddress(iLib,'RegisterServiceProcess');
   rsFunct(GetCurrentProcessID,1);
   result:=true;
  end else result:=false;
end;

begin
  HideFromTaskmanager();
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Feedback erwünscht.