Now that Las Vegas Devcon is over, I’ll be posting some of my sample code from the keynote and my session here.

 

I demonstrated how to make a simple VFP screen saver. To test it, invoking it immediately is useful.

 

Windows XP allows you to have a screen saver activate after 1 or more minutes of inactivity from the mouse or keyboard.

However, there doesn’t seem to be a simple way to start the screen saver immediately. You can hit the Windowskey + L to lock the computer, but that just brings up the login screen.

 

You can see which screen saver is registered from the VFP command window:

            !start  desk.cpl

 

 

Here’s some code that will start the current screen saver immediately.

 

            *Start screen saver immediately

      #define WM_SYSCOMMAND   0x0112

      #define SC_SCREENSAVE   0xF140

 

      DECLARE integer GetDesktopWindow IN WIN32API

      DECLARE integer SendMessage IN WIN32API ;

            integer hWnd,;

            integer msg,;

            integer wParam,;

            integer lParam

           

      SendMessage(GetDesktopWindow(),WM_SYSCOMMAND,SC_SCREENSAVE,0)

 

 

 

Of course you can make an EXE from this code and put a shortcut on your Start menu and create a Hotkey for it:

 

*Start screen saver immediately

TEXT TO myvar TEXTMERGE noshow

#define WM_SYSCOMMAND   0x0112

#define SC_SCREENSAVE   0xF140

 

DECLARE integer GetDesktopWindow IN WIN32API

DECLARE integer SendMessage IN WIN32API ;

      integer hWnd,;

      integer msg,;

      integer wParam,;

      integer lParam

     

SendMessage(GetDesktopWindow(),WM_SYSCOMMAND,SC_SCREENSAVE,0)

ENDTEXT

STRTOFILE(myvar,"SSaver.prg")

STRTOFILE("screen=off","config.fpw")

MODIFY PROJECT SSaver nowait

_vfp.ActiveProject.Files.Add("SSaver.prg")

_vfp.ActiveProject.Files.Add("config.fpw")

_vfp.ActiveProject.Build("ssaver.exe")

_vfp.ActiveProject.Close

*!/n SSaver

*Now create a shortcut to the exe and put it on the start menu

LOCAL oSh as WScript.Shell

oSh=CREATEOBJECT("WScript.Shell")

cStartMenu=oSh.SpecialFolders("StartMenu")

LOCAL oScut as WSCRIPT.WshShortcut

oScut=osh.CreateShortcut(cStartMenu+"\ssaver.lnk")

oScut.Description="VFP Screen saver starter"

oScut.Hotkey="CTRL+ALT+SHIFT+S"

*oScut.IconLocation=

oScut.TargetPath=SYS(5)+CURDIR()+"ssaver.exe"

oScut.Save

 

 

 

You can use the registry or WMI to list the screen savers:

 

*Use WMI to list screen savers

strComputer = "."

objWMIService = GetObject("winmgmts:\\" + strComputer + "\root\cimv2")

colItems = objWMIService.ExecQuery("Select * from Win32_Desktop")

For Each objItem in colItems

    ? "Screen Saver Secure: " + TRANSFORM(objItem.ScreenSaverSecure)

    ??" ",objItem.ScreenSaverExecutable," ",objItem.ScreenSaverTimeout

Next

 

 

This code uses SystemParametersInfo to control the screen saver.  If your application needs to run for longer than the screen saver timeout and you’d like to have full processing power of the CPU, or if you’d like to show UI without a screen saver showing, you can disable it.

 

#define SPI_GETSCREENSAVETIMEOUT    0x000E

#define SPI_SETSCREENSAVETIMEOUT    0x000F

#define SPI_GETSCREENSAVEACTIVE     0x0010

#define SPI_SETSCREENSAVEACTIVE     0x0011

#define SPI_GETSCREENSAVERRUNNING 0x0072

#define SPI_SETSCREENSAVERRUNNING   0x0061

#define SPI_SCREENSAVERRUNNING     SPI_SETSCREENSAVERRUNNING

#define SPIF_SENDWININICHANGE 0x0002

 

DECLARE integer SystemParametersInfo IN WIN32API ;

      integer uiAction,;

      integer uiParam,;

      integer @ pvParam ,;

      integer fWinini

nval=0     

SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@nVal,0)

 

?"Screen Saver is"+IIF(nval=0," Not","")+" active.",DATETIME()

 

fEnable =IIF(MESSAGEBOX("Enable screen saver?",4)=6,1,0)    && 6=YES

SystemParametersInfo(SPI_SETSCREENSAVEACTIVE,fEnable ,0,0)

nval=0     

SystemParametersInfo(SPI_GETSCREENSAVEACTIVE,0,@nVal,0)

?"Screen Saver is"+IIF(nval= 0," Not","")+" active.",DATETIME()

ns=SECONDS()

DO WHILE SECONDS()-ns < 60 AND INKEY(1)=0

      WAIT WINDOW NOWAIT TRANSFORM(INT(SECONDS()-ns))

ENDDO

 

 

 

 39255