2010. november 6., szombat

Set the current screensaver


Problem/Question/Abstract:

In my company each user needs to have a screensaver set with a specific timeout period, how can I do this?

Answer:

The following code sets up your desired screensave then shows it. For actual use this code needs to be changed to suite your needs i.e. remove ShowMessage dialogs, change name of screensaver, change timeout value and remove actual testing section.

Tested under Windows XP but should work with earlier versions of Windows

program SetupDefaultScrnSaver;

uses
  Windows, SysUtils, Forms, Dialogs, Registry;

const
  { from Windows.pas }
  SPI_SETSCREENSAVEACTIVE = 17;
  SPIF_SENDWININICHANGE = 2;
  SPI_SETSCREENSAVETIMEOUT = 15;
  { from Messages.pas }
  WM_SYSCOMMAND = $0112;

  { From Project JEDI JCL library
    http://www.delphi-jedi.org/Jedi:CODELIBJCL:22798 }

function GetWindowsSysFolder: string;
  procedure StrResetLength(var S: AnsiString);
  begin
    SetLength(S, StrLen(PChar(S)));
  end;
var
  Required: Cardinal;
begin
  Result := '';
  Required := GetSystemDirectory(nil, 0);
  if Required <> 0 then
  begin
    SetLength(Result, Required);
    GetSystemDirectory(PChar(Result), Required);
    StrResetLength(Result);
  end;
end;

function SetScreenSave(const Name: string; const TimeOut: Integer = 30): Boolean;
const
  SixtySeconds = 60;
var
  Reg: TRegistry;
begin
  if not FileExists(Name) then
  begin
    ShowMessage('ScreenSaver "' + Name + '" not located');
    exit;
  end;

  Reg := TRegistry.Create;
  Reg.RootKey := HKEY_CURRENT_USER;
  try
    with Reg do
    begin
      if OpenKey('Control Panel\Desktop', False) then
      begin
        WriteString('SCRNSAVE.EXE', Name);
        WriteString('ScreenSaverIsSecure', '1');
        CloseKey;
      end
      else
      begin
        Result := False;
        exit;
      end;
    end;
  finally
    Reg.Free;
  end;

  SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, nil, SPIF_SENDWININICHANGE);
  SystemParametersInfo(SPI_SETSCREENSAVETIMEOUT, SixtySeconds * TimeOut,
    nil, SPIF_SENDWININICHANGE);
  Result := True;
end;

begin
  { -=CHANGE THE SCREENSAVER NAME TO ONE YOU WANT THE USER TO HAVE=- }
  if SetScreenSave(GetWindowsSysFolder + '\ss3dfo.scr') then
  begin
    ShowMessage('Screensaver set, press OK to test (remember grace period)');
    PostMessage(GetDesktopWindow, WM_SYSCOMMAND, SC_SCREENSAVE, 0);
  end;
end.

Nincsenek megjegyzések:

Megjegyzés küldése