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