Announcement

Collapse
No announcement yet.

Programm im "Anwendungen schliesen"-Dialog verstecken.

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Programm im "Anwendungen schliesen"-Dialog verstecken.

    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...

  • #2
    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

    Working...
    X