Results 1 to 10 of 10

Thread: Sreensaver

  1. #1

    Unhappy Sreensaver

    Ik heb een screensaver gemaakt in Delphi, allemaal leuk en aardig maar ik wil nu weten hoe ik een dialog kan opgeven voor de instellingen en hoe ik een afbeelding kan opgeven voor bij de instellingen van het beeldscherm (tabblad schermbeveiliging) in die monitor. Tot nu toe heb ik gewoon in form1 de werkelijke screensaver gemaakt en bij de project options als output extension scr ingevoerd. Dat werk wel maar nu gebruikt hij voor al die dingen de werkelijke screensaver, als je alleen al naar het venter beeldscherminstellingen bij het tabblad scermbeveiliging gaat (en mijn screensaver is ingesteld) dan wordt de screensaver gelijk gestart en dat gebeurd ook als ik de instellingen wil bekijken... Weet iemand eventueel een sourcecode van een screensaver te vinden (uiteraard in Delphi) Dan kan ik zelf ook eens kijken hoe ze dat allemaal hebben gedaan...
    Lynx,
    www.animals.nl

  2. #2
    Ik denk dat je hier een heel eind mee komt: http://community.borland.com/article...,26652,00.html
    Marcel

  3. #3

  4. #4
    Owjah, die is oo fijn. Ik denk dat het zo wel gaat lukken en zo niet dan weet ik zeker dat het aan mij ligt
    Lynx,
    www.animals.nl

  5. #5
    Het is al gelukt! Ik heb gelijk een libary geschreven met een aantal procedures die benodigt/handig zijn bij het maken van een screensaver. Als er een aantal mensen zijn die interesse erin hebben zal ik heb wel even bijwerken en op het forum zetten (source)
    Lynx,
    www.animals.nl

  6. #6
    5th member of nldelphi
    Join Date
    Mar 2001
    Location
    Alkmaar
    Posts
    2,127

    Thumbs up Gewoon doen,

    Lynx, gewoon doen niet vragen, ik kan me heel goed voorstellen dat meerdere mensen hier eens naar zouden kijken, is altijd leuk om iets terug te zien waar vragen over zijn geweest op dit forum, en mischien brengt het andere nog op iedeen of kunnen ze / we er nog wat van leren.
    Dus....

    Plaatsen die hap.

    Mits Marcel er natuurlijk geen problemen mee heeft qua groote dan he.
    RLD

  7. #7
    Ok, ik doe het! En de grootte? Jah als je het dll bestand op de site zet... die komt over de 200kb. Ik kan natuurlijk ook de source op het forum zetten zodat je het zelf kan compilen. Binnenkort staat de source erop en ga nu dus nog even wat bijwerken.

  8. #8

    Post Dll source

    Hier komt dan de source van het dll bestand. Ik heb er wat informatie bijgezet zodat je gelijk weer weet waarvoor het eigenlijk dient. Als je nog vragen hebt dan hoor ik het wel!

    Code:
     
    library ScrSaver32;
    
    uses
      ShareMem, SysUtils, Classes, Graphics, Controls, Dialogs,
      Forms, Messages, Registry, Windows, IniFiles, WinTypes,
      WinProcs, ExtCtrls, StdCtrls;
    
    type
      TScrMode = (smNone, smRun, smPreview, smTest, smConfig, smSetPwd);
    
    const
      IsScreenSetup: Boolean = False;
      ScrMode: TScrMode = smNone;
      IsRunning: Boolean = False;
    
    procedure SetupScreen(Form: TForm); stdcall;
    begin
      with Form do
      begin
        //De randen worden weggehaalt
        Form.BorderStyle := bsNone;
        //De achtergrondkleur wordt zwart
        Form.Color := clBlack;
        //Het startmenu wordt weggehaalt
        SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
        //Met stayontop blijft de form op de bovenste layer
        Form.FormStyle := fsStayOnTop;
        //De cursor wordt weggehaalt
        ShowCursor(False);
        //Het form wordt tegen de linkerbovenhoek gezet
        Left := 0;
        Top := 0;
        //Het form krijgt de hoogte en breedte van het scherm
        Width := Screen.Width;
        Height := Screen.Height;
      end;
      IsScreenSetup := True;
    end;
    
    //Deze procedure moet gebruikt worden wanneer de screensaver wordt afgesloten. Dit biedt tevens ondersteuning voor een eventueel  wachtwoord.
    procedure ScrClose(Form: TForm); stdcall;
    var
      MyMod: THandle;
      PwdFunc: function (Parent : THandle) : Boolean; stdcall;
      SysDir: String;
      NewLen: Integer;
      MyReg: TRegistry;
      OkToClose: Boolean;
    begin
      if ScrMode <> smRun then
      begin
       Application.Terminate;
      end;
      OkToClose := False;
      MyReg := TRegistry.Create;
      MyReg.RootKey := HKEY_CURRENT_USER;
      if MyReg.OpenKey('Control Panel\Desktop',False) then begin
        try
          try
            ShowCursor(True);
            if MyReg.ReadInteger('ScreenSaveUsePassword') <> 0 then begin
              SetLength(SysDir,MAX_PATH);
              NewLen := GetSystemDirectory(PChar(SysDir),MAX_PATH);
              SetLength(SysDir,NewLen);
              if (Length(SysDir) > 0) and (SysDir[Length(SysDir)] <> '\') then
                SysDir := SysDir+'\';
              MyMod := LoadLibrary(PChar(SysDir+'PASSWORD.CPL'));
              if MyMod = 0 then
                OkToClose := True
              else begin
                PwdFunc := GetProcAddress(MyMod,'VerifyScreenSavePwd');
                FreeLibrary(MyMod);
              end;
            end
            else
              OkToClose := True;
          finally
            ShowCursor(False);
          end;
        except
          OkToClose := True;
        end;
      end
      else
        OkToClose := True;
      MyReg.Free;
      if OkToClose then
        Application.Terminate;
    end;
    
    //Met deze procedure wordt de cursor weggehaalt
    procedure CursorOff; stdcall;
    begin
      ShowCursor(False);
    end;
    
    //Met deze procedure wordt de cursor weer weergegeven.
    procedure CursorOn; stdcall;
    begin
      SetCursorPos(Screen.Width div 2, Screen.Height div 2);
      ShowCursor(True);
    end;
    
    //Deze procedure wordt gebruikt om instellingen weg te schrijven naar een ini-bestand (controls.ini)
    procedure WriteIniStr(Section: string; Ident: string; Value: string); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.WriteString(Section, Ident, Value);
      IniFile.Free;
    end;
    
    //Deze procedure wordt gebruikt om instellingen weg te schrijven naar een ini-bestand (controls.ini)
    procedure WriteIniInteger(Section: string; Ident: string; Value: Integer); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.WriteInteger(Section, Ident, Value);
      IniFile.Free;
    end;
    
    //Deze procedure wordt gebruikt om instellingen weg te schrijven naar een ini-bestand (controls.ini)
    procedure WriteIniBool(Section: string; Ident: string; Value: Boolean); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.WriteBool(Section, Ident, Value);
      IniFile.Free;
    end;
    
      //De waarde value wordt niet uitgelezen maar vervangen!
    procedure ReadIniStr(Section: string; Ident: string; Value: String); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.ReadString(Section, Ident, Value);
      IniFile.Free;
    end;
    
      //De waarde value wordt niet uitgelezen maar vervangen!
    procedure ReadIniInteger(Section: string; Ident: string; Value: Integer); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.ReadInteger(Section, Ident, Value);
      IniFile.Free;
    end;
    
      //De waarde value wordt niet uitgelezen maar vervangen!
    procedure ReadIniBool(Section: string; Ident: string; Value: Boolean); stdcall;
    var
      IniFile: TIniFile;
    begin
      IniFile := TIniFile.Create('CONTROL.INI');
      IniFile.ReadBool(Section, Ident, Value);
      IniFile.Free;
    end;
    
    //Deze procedure moet gestart worden bij OnFormActivate van de screensaver (dus niet de instellingen)
    procedure ScrFormActivate(Form: TForm); stdcall;
    var
      Dummy: Boolean;
    begin
      with Form do
      begin
        SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE + SWP_NOMOVE);
        SystemParametersInfo(SPI_SCREENSAVERRUNNING,1,@Dummy,0);
        Visible := True;
      end;
    end;
    
    //Met deze procedure wordt er een screenshot gemaakt.
    procedure MakeDesktopImage(Bitmap: TBitmap); stdcall;
    var
      DesktopBitmap: TBitmap;
    begin
      DesktopBitmap := TBitmap.Create;
      with DesktopBitmap do begin
        Width := Screen.Width;
        Height := Screen.Height;
      end;
      BitBlt(DesktopBitmap.Canvas.Handle,0,0,Screen.Width,Screen.Height,
              GetDC(GetDesktopWindow),0,0,SrcCopy);
      Bitmap := DesktopBitmap;
      DesktopBitmap.Free;
    end;
    
    //In exports worden de procedures gezet die worden geëxporteerd
    exports
      SetupScreen, ScrClose, CursorOff, CursorOn,
      WriteIniStr, WriteIniInteger, WriteIniBool,
      ReadIniStr, ReadIniInteger, ReadIniBool,
      ScrFormActivate, MakeDesktopBitmap;
    
    begin
    end.
    Ok dat was hem dan, hier komt nu de manier om de procedures te declareren in het programma of eigenlijk de screensaver.

    Code:
     
     procedure SetupScreen(Form: TForm); stdcall; external 'ScrSaver32.dll'
     procedure ScrClose(Form: TForm); stdcall; external 'ScrSaver32.dll'
     procedure CursorOff; stdcall; external 'ScrSaver32.dll'
     procedure CursorOn; stdcall; external 'ScrSaver32.dll'
     procedure WriteIniStr(Section: string; Ident: string;
       Value: string); stdcall; external 'ScrSaver32.dll'
     procedure WriteIniInteger(Section: string; Ident: string;
       Value: Integer); stdcall; external 'ScrSaver32.dll'
     procedure WriteIniBool(Section: string; Ident: string;
       Value: Boolean); stdcall; external 'ScrSaver32.dll'
      //De waarde value wordt niet uitgelezen maar vervangen!
     procedure ReadIniStr(Section: string; Ident: string;
       Value: string); stdcall; external 'ScrSaver32.dll'
      //De waarde value wordt niet uitgelezen maar vervangen!
     procedure ReadIniInteger(Section: string; Ident: string;
       Value: Integer); stdcall; external 'ScrSaver32.dll'
      //De waarde value wordt niet uitgelezen maar vervangen!
     procedure ReadIniBool(Section: string; Ident: string;
       Value: Boolean); stdcall; external 'ScrSaver32.dll'
     procedure ScrFormActivate(Form: TForm); stdcall; external 'ScrSaver32.dll'
     procedure MakeDesktopImage(Bitmap: TBitmap); stdcall; external 'ScrSaver32.dll'
    Lynx,
    www.animals.nl

  9. #9
    Hier een uitwerking van de screensaver zelf (project source). De procedures zijn voor de duidelijkheid weggelaten. Dit is alleen iets wat doorgeeft welke procedure er gestart moet worden en als de screensaver al gestart is dan wordt de 2e afgesloten zodat er altijd maar 1 screensaver actief is. Dit is nodig omdat windows zo dom is de screensaver nog een keer op te starten wanneer deze al gestart is.

    Code:
     
    
    program Screensaver;
    
    uses
      Forms, SysUtils, Windows, Graphics, Classes;
    
    {$E SCR}
    {$R *.RES}
    
    type
      TSSMode = (ssSetPwd, ssTest, ssConfig, ssPreview, ssNone);
    
    var
      MySem: THandle;
      Arg1, Arg2: String;
      DemoWnd: HWnd;
      MyRect: TRect;
      ScrWidth, ScrHeight: Integer;
      SysDir: String;
      NewLen: Integer;
      MyMod: THandle;
      PwdFunc: function (a : PChar; ParentHandle : THandle; b, c : Integer) :
                        Integer; stdcall;
    
    const
      SSMode: TSSMode = ssNone;
    
    begin
      Arg1 := UpperCase(ParamStr(1));
      Arg2 := UpperCase(ParamStr(2));
    
      if (Copy(Arg1,1,2) = '/A') or (Copy(Arg1,1,2) = '-A') or
         (Copy(Arg1,1,1) = 'A') then
        SSMode := ssSetPwd;
    
      if (Copy(Arg1,1,2) = '/P') or (Copy(Arg1,1,2) = '-P') or
         (Copy(Arg1,1,1) = 'P') then
        SSMode := ssPreview;
    
      if (Copy(Arg1,1,2) = '/C') or (Copy(Arg1,1,2) = '-C') or
         (Copy(Arg1,1,1) = 'C') or (Arg1 = '') then
        SSMode := ssConfig;
    
      if SSMode = ssSetPwd then begin
        SetLength(SysDir,MAX_PATH);
        NewLen := GetSystemDirectory(PChar(SysDir),MAX_PATH);
        SetLength(SysDir,NewLen);
        if (Length(SysDir) > 0) and (SysDir[Length(SysDir)] <> '\') then
          SysDir := SysDir+'\';
        MyMod := LoadLibrary(PChar(SysDir+'MPR.DLL'));
        if MyMod <> 0 then begin
          PwdFunc := GetProcAddress(MyMod,'PwdChangePasswordA');
          if Assigned(PwdFunc) then
            PwdFunc('SCRSAVE',StrToInt(Arg2),0,0);
          FreeLibrary(MyMod);
        end;
        Halt;
      end;
    
      MySem := CreateSemaphore(nil,0,1,'SimpleSaverSemaphore');
      if ((MySem <> 0) and (GetLastError = ERROR_ALREADY_EXISTS)) then begin
        CloseHandle(MySem);
        Halt;
      end;
    
      Application.Initialize;
    
      if SSMode = ssPreview then begin
        DemoWnd := StrToInt(Arg2);
        while not IsWindowVisible(DemoWnd) do
          Application.ProcessMessages;
        GetWindowRect(DemoWnd,MyRect);
        ScrWidth := MyRect.Right-MyRect.Left+1;
        ScrHeight := MyRect.Bottom-MyRect.Top+1;
        MyRect := Rect(0,0,ScrWidth-1,ScrHeight-1);
        while IsWindowVisible(DemoWnd) do begin
          {
           Hier komt de procedure die uitgevoerd moet worden in het preview venstertje zolang het venster zichbaar is.
          }
        end;
        CloseHandle(MySem);
        Halt;
      end;
    
      if SSMode = ssConfig then begin
        Application.Title := 'Screensaver';
        //Hier komt de procedure die uitgevoert wordt wanneer het venster met de instellingen wordt opgeroepen. Hierij zal wellicht met Application.CreateForm(Naam, Type); een form moeten worden gecreëerd.
      end else
        //Hier komt de procedure wanneer de screensaver gestart moet worden
    
      Application.Run;
    
      CloseHandle(MySem);
    end.
    Lynx,
    www.animals.nl

  10. #10
    Made by Lynx, geen copyright, ik ben tenslotte geen softwarefabrikant,
    dat leek me een beetje overdreven nu ik nog maar 14 jaar ben
    Lynx,
    www.animals.nl

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •