Restored from previous forum. Originally posted by Kale.
 Oh i give up! can anybody help me out with this one, i must admit to never doing this before and i'm sure its pretty easy once you know how it is done:
I am trying to write a screensaver template that i can use and modify to code a few different screensavers. I understand how the screensaver is called from the display properties dialog, but i'm having trouble getting the damn preview to quit so i can start the screensaver by pressing 'preview'. Also when i close the display properties dialog, the screensaver is still running in the background? any ideas, this is driving me nuts. This is what i have cobbled together from examples found on this forum, can you see any problems? things i've missed? because it doesn't work! 
 
Code: Select all
;===========================================================================
;-INCLUDED FILES
;===========================================================================
;===========================================================================
;-CONSTANTS
;===========================================================================
;===========================================================================
;-GLOBAL FLAGS / VARIABLES / STRUCTURES / ARRAYS
;===========================================================================
Global screenWidth.l
Global screenHeight.l
Global previewFlag.l
Global parameter.s
Global prevWinHndlString.s
Global prevWinHndl.l
screensaverName.s = "PureBasic ScreenSaver"
screenWidth.l = GetSystemMetrics_(#SM_CXSCREEN)
screenHeight.l = GetSystemMetrics_(#SM_CYSCREEN)
parameter = UCase(ProgramParameter())
If Len(parameter) > 2
    prevWinHndlString = RemoveString(parameter, Left(parameter, 3), 1)
    parameter = RemoveString(parameter, Left(parameter, 1), 1)
    parameter = Left(parameter, 1)
Else
    parameter = RemoveString(parameter, Left(parameter, 1), 1)
    prevWinHndlString = ProgramParameter()
    If FindString(prevWinHndlString, "-", 0)  0 : prevWinHndlString = RemoveString(prevWinHndlString, "-", 1) : EndIf
    If FindString(prevWinHndlString, "/", 0)  0 : prevWinHndlString = RemoveString(prevWinHndlString, "/", 1) : EndIf
EndIf
prevWinHndl = Val(prevWinHndlString)
;===========================================================================
;-PROCEDURES
;===========================================================================
;simple error checking
Procedure HandleError (result, text.s)
    If result = 0 : MessageRequester("Error", text, #PB_MessageRequester_Ok) : End : EndIf
EndProcedure
;start only one screensaver
Procedure OnlyOneSCRStart(screensaverName.s)
    Shared OnlyOneStartMutex.l
    OnlyOneStartMutex=CreateMutex_(0,1,screensaverName)
    OnlyOneStartError.l=GetLastError_()
    If OnlyOneStartMutex0 And OnlyOneStartError=0
        ProcedureReturn 1
    Else
        CloseHandle_(OnlyOneStartMutex)
        End
    EndIf
EndProcedure
;close the screensaver
Procedure OnlyOneSCRStop()
    CloseHandle_(OnlyOneStartMutex)
EndProcedure
;run the fullscreen screensaver code
Procedure ExecuteScreenSaver()
    Shared screensaverName
    HandleError(OpenScreen(screenWidth, screenHeight, 32, screensaverName), "A fullscreen screen could not be opened!")
    ShowCursor_(0)
        CatchSprite(0, ?PBLogo, 0)
        XMax = (GetSystemMetrics_(#SM_CXSCREEN)/2)-(SpriteWidth(0)/2)
        YMax = (GetSystemMetrics_(#SM_CYSCREEN)/2)-(SpriteHeight(0)/2)
    
    Repeat
        ClearScreen(0,0,0)
        DisplaySprite(0, XMax+x, YMax+x)
        DisplaySprite(0, XMax-x, YMax-x)
        DisplaySprite(0, XMax+x, YMax-x)
        DisplaySprite(0, XMax-x, YMax+x)
        DisplaySprite(0, XMax+x, YMax)
        DisplaySprite(0, XMax-x, YMax)
        DisplaySprite(0, XMax, YMax+x)
        DisplaySprite(0, XMax, YMax-x)
        If x  0 Or MouseDeltaY()  0 Or MouseWheel()  0 Or MouseButton(1)  0 Or MouseButton(2)  0
    ShowCursor_(1)
    End
EndProcedure
;===========================================================================
;-MEDIA
;===========================================================================
;===========================================================================
;-GEOMETRY
;===========================================================================
;configuration window
Procedure Config()
    Shared screensaverName
    If OpenWindow(0, 0, 0, 320, 240, #PB_Window_SystemMenu | #PB_Window_WindowCentered, screensaverName)
        Repeat
            EventID.l = WaitWindowEvent()
        Until EventID = #PB_EventCloseWindow
    EndIf
EndProcedure
;===========================================================================
;-MAIN
;===========================================================================
OnlyOneSCRStart(screensaverName)
;deal with the parameters passed to this program
Select parameter
    ;double clicked
    Case ""
        Config()
    ;'Settings' button clicked in the screensaver dialog
    Case "C"
        Config()
    ;when the preview is requested in the dialog by selecting this screensaver
    Case "P"
        previewWindowSize.RECT
        GetClientRect_(prevWinHndl, @previewWindowSize)
        CatchImage(1, ?PreviewImage)
        HandleError(CreateGadgetList(prevWinHndl), "Gadget list in preview panel could not be created!")
        ImageGadget(1, 0, 0, previewWindowSize\right, previewWindowSize\bottom, UseImage(1))
        Repeat
            EventID.l = WaitWindowEvent()
        Until EventID = #PB_EventCloseWindow
        End
    ;launch the main screensaver after an interval or by pressing 'Preview' in the dialog
    Case "S"
        HandleError(InitSprite(), "DirectX v7.0 or above can not be found or initialised!")
        HandleError(InitKeyboard(), "DirectX v7.0 or above can not be found or initialised!")
        HandleError(InitMouse(), "DirectX v7.0 or above can not be found or initialised!")
        ExecuteScreenSaver()
EndSelect
End
;===========================================================================
;-BINARY INCLUDES
;===========================================================================
PBLogo:
    IncludeBinary "PureBasic.bmp"
    
PreviewImage:
    IncludeBinary "preview.bmp"
--Kale
In love with PureBasic! 