hat jemand eine ahnung, wie man ein delphiprogramm so verstecken kann, daß es im taskmanager nicht mehr aufscheint? ich bräuchte eine lösung, die unter win9x als auch unter win nt funktioniert...
Announcement
Collapse
No announcement yet.
Programm im "Anwendungen schliesen"-Dialog verstecken.
Collapse
X
-
Hallo,
eine Anwendung, die über den <i>Taskmanager</i> nicht angezeigt und somit auch nicht "abgewürgt" werden kann, wird als <b>Service</b> bezeichnet. Unter Windows NT sind die <b>Dienste</b> üblich - die große Delphi-Version stellt dazu einen eigenen Wizard inklusive der VCL-Klassen zur Verfügung.
Für <b>Windows 9x</b> sieht die Sache anders aus, hier gibt es keine Dienste - allerdings steht hier mit der <b>Service-Anwendung</b> ein anderer Ausweg zur Verfügung. Eine Service-Anwendung darf vom Benutzer nicht geschlossen werden, sondern muß mit dem Start von Windows 9x die ganze Zeit über aktiv sein. Außerdem sollte die Service-Anwendung auch als solche für den Anwender erkennbar sein, d.h. es werden die folgenden Eigenschaften erwartet:<br>
- Das Programmfenster darf nicht in der Taskbar von Windows auftauchen. Wird eine Benutzerschnittstelle benötigt, so soll die Anwendung über ein Icon in der Taskbar Notification Area der Taskleiste erreichbar sein. <br>
- Die Service-Anwendung darf auch nicht im Windows-Dialog "Anwendung schließen" (CTRL+ALT+DEL) erscheinen, d.h. der Anwender hat keine Möglichkeit, die Service-Anwendung manuell zu beenden.
Damit ein mit Delphi entwickeltes Anwendungsprogramm diese Forderungen erfüllt, sind die folgenden Implementierungen nötig:<br>
- Application.ShowMainForm := False nach Application.Initialize <br>
- ShowWindow(Application.Handle, SW_HIDE) vor Application.Run <br>
- ShowWindow(Application.Handle, SW_HIDE) im Initialization-Block jeder Formular-Unit <br>
-Über die Win32-API-Funktion <b>RegisterServiceProcess</b> wird zudem die Anwendung im Windows-Dialog "Anwendung schließen" (CTRL+ALT+DEL) verborgen! Das könnte zum Beispiel so aussehen:
<pre>
type
TRegisterServiceProcess = function (dwProcessID, dwTypeWORD)WORD; stdcall;
const
cTaskBarId = 1; // ID für die Taskbar notification area
RSP_SIMPLE_SERVICE = 1;
RSP_UNREGISTER_SERVICE = 0;
var
RegisterServiceProcess : TRegisterServiceProcess;
{ Programmstart -> Icon im Benachrichtigsbereich der Windows-
TaskBar einrichten. }
procedure TFormLogin.FormCreate(Sender: TObject);
var
Hndl : THandle;
begin
...
// Programm im Win9x-Dialog "Anwendung schließen" verbergen
Hndl := LoadLibrary('KERNEL32.DLL');
try
@RegisterServiceProcess := GetProcAddress(Hndl, 'RegisterServiceProcess');
if @RegisterServiceProcess <> nil then
RegisterServiceProcess(GetCurrentProcessID, RSP_SIMPLE_SERVICE);
finally
FreeLibrary(Hndl);
end;
end;
procedure TFormLogin.FormDestroy(Sender: TObject);
var
Hndl : THandle;
begin
...
// Programm im Win9x-Dialog "Anwendung schließen" verbergen
Hndl := LoadLibrary('KERNEL32.DLL');
try
@RegisterServiceProcess := GetProcAddress(Hndl, 'RegisterServiceProcess');
if @RegisterServiceProcess <> nil then
RegisterServiceProcess(GetCurrentProcessID, RSP_UNREGISTER_SERVICE);
finally
FreeLibrary(Hndl);
end;
end;
</pre>
Das Programm muß dann nur noch in der Registry unter <b>HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\C urrentVersion\RunServices</b> eingetragen werden und steht dann sofort beim Windows-Start zur Verfügung
Comment