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:
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:
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' ;
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.