Ich hab mal aus langeweile eine Bildschirmschoner Vorlage geschrieben die auch für Anfäger leichter zu verstehn ist. In der aus dem Code Archive sind nämlich fast nur API Funktionen drinn und das ganze ist ned so leicht überschaubar vorallem bei dem Preview. Hier mal eine gut Kommentierte Vorlage die alles kann was ein schoner so braucht Vorschau, Passwortabfrage, Config und der schoner selbst natürlich

Code: Alles auswählen
;Konstanten Declarieren
;-Fenster
Enumeration
#Window_Saver
EndEnumeration
;-Images
Enumeration
#Image_Preview
#Image_Saver
EndEnumeration
;-Gadgets
Enumeration
#ImageGadget_Preview
#ImageGadget_Saver
EndEnumeration
;-sonstige
#MaxMouseMove = 10
;Proceduren Declarieren
Declare Config()
Declare SetPassword()
Declare VerifyPassword(wnd)
Declare SaverPreview(hwnd)
Declare SaverMain()
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Proceduren
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Konfiguration
Procedure Config()
MessageRequester("Hinweis", "Hier könnte ihre Werbung stehn!", #MB_ICONINFORMATION)
ProcedureReturn 0
EndProcedure
;Passwort ändern
Procedure SetPassword()
If OpenLibrary(0,"mpr.dll")
CallFunction(0 ,"PwdChangePasswordA","SCRSAVE",ScrWnd,0,0)
CloseLibrary(0)
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
;Passwort abfragen
Procedure VerifyPassword(wnd)
;Passwort abfragen
Retval = 1
If (OSVersion()=#PB_OS_Windows_95) Or (OSVersion()=#PB_OS_Windows_98)Or (OSVersion()=#PB_OS_Windows_ME)
Retval = 0
hKey.l=0
If RegOpenKeyEx_(#HKEY_CURRENT_USER,"'Control Panel\desktop",0,#KEY_READ,@hKey)
;Ist Passwortschutz aktiv ?
If OpenLibrary(0,"Password.cpl")
;Abfrage
ShowCursor_(1)
Retval = CallFunction(0,"VerifyScreenSavePwd",wnd)
ShowCursor_(Retval)
CloseLibrary(0)
EndIf
RegCloseKey_(hKey)
EndIf
EndIf
ProcedureReturn Retval
EndProcedure
;Screensaver Vorschau
Procedure SaverPreview(hwnd)
;Vorschau Fenstergröse ermitteln
GetClientRect_(hwnd, @rc.rect)
;Image für die Vorschu erstellen
CreateImage(#Image_Preview, rc\right, rc\bottom)
;Image Gadget für die Vorschu erstellen
UseGadgetList(hwnd)
ImageGadget(#ImageGadget_Preview, 0, 0, 0, 0, ImageID(#Image_Preview))
CloseGadgetList()
;Renderschleife
Repeat
;Demo Rendern
StartDrawing(ImageOutput(#Image_Preview))
Box(Random(rc\right / 2), Random(rc\bottom / 2), Random(rc\right / 2), Random(rc\bottom / 2), RGB(Random(255), Random(255), Random(255)))
StopDrawing()
;Wenn das Gadget Nicht mehr existiert muss das programm beendet werden
If Not IsGadget(#ImageGadget_Preview)
Break
EndIf
;Image Gadget Aktualisieren
SetGadgetState(#ImageGadget_Preview, ImageID(#Image_Preview))
;Zum entlasten der cpu 10ms Timeout
WaitWindowEvent(10)
ForEver
ProcedureReturn 0
EndProcedure
;Screensaver Main
Procedure SaverMain()
;Mauscursor verstecken
ShowCursor_(0)
;Mausposition speichern
GetCursorPos_(@lastmouse.POINT)
;Bildschirm Auflösung ermitteln
ExamineDesktops()
screenx = DesktopWidth(0)
screeny = DesktopHeight(0)
;Image erstellen
CreateImage(#Image_Saver, screenx, screeny)
;Fenster öffnen und gadgets erstellen
If Not OpenWindow(#Window_Saver, 0, 0, screenx, screeny, "Screen Saver", #PB_Window_BorderLess)
ProcedureReturn 0
EndIf
CreateGadgetList(WindowID(#Window_Saver))
ImageGadget(#ImageGadget_Saver, 0, 0, screenx, screeny, ImageID(#Image_Saver))
StickyWindow(#Window_Saver, 1)
;Windows mitteilen das ein Saver läuft
SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 1, @oldval, 0)
;Render Schleife
Repeat
;Demo Rendern
StartDrawing(ImageOutput(#Image_Saver))
Box(Random(screenx / 2), Random(screeny / 2), Random(screenx / 2), Random(screeny / 2), RGB(Random(255), Random(255), Random(255)))
StopDrawing()
;Image Gadget aktualisieren
SetGadgetState(#ImageGadget_Saver, ImageID(#Image_Saver))
;Mausbewegung Abfragen
GetCursorPos_(@mouse.POINT)
If (mouse\x - lastmouse\x) > #MaxMouseMove Or (lastmouse\x - mouse\x) > #MaxMouseMove
If VerifyPassword(WindowID(#Window_Saver))
Break
EndIf
ElseIf (mouse\y - lastmouse\y) > #MaxMouseMove Or (lastmouse\y - mouse\y) > #MaxMouseMove
If VerifyPassword(WindowID(#Window_Saver))
Break
EndIf
EndIf
;Tastatur abfrage und Timot zur entlastung der cpu
If WaitWindowEvent(10) = #WM_KEYUP
If VerifyPassword(WindowID(#Window_Saver))
Break
EndIf
EndIf
ForEver
;Windows mitteilen das der Saver beendet wurde
SystemParametersInfo_(#SPI_SCREENSAVERRUNNING, 0, @oldval, 0)
;Fenster Schliessen
CloseWindow(#Window_Saver)
EndProcedure
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Main Programm
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Programm Parameter Auslesen
param1.s = ProgramParameter()
param2.s = ProgramParameter()
;Auf Parametertrennung mit Doppelpunkt prüfen
If Len(param1) > 2
param2 = Right(param1, Len(param1)-3)
param1 = Left(param1, 2)
EndIf
;Startparameter Auswahl
param1 = LCase(param1)
Select param1
Case "/c" ;Konfiguration
Config()
Case "/a" ;Passwort ändern
SetPassword()
Case "/p" ;Preview
SaverPreview(Val(param2))
Case "/s" ;Screensaver
SaverMain()
Default
Config()
EndSelect
;Programmende
End
