Reacting to Windows Session events.

Sometimes it’s useful to run some code in response to an event like somebody locking or unlocking your desktop via Ctrl-Alt-Del or WindowsKey+L or the screen saver activating

You can use the new VFP9 BindEvent to capture WM_WTSSESSION_CHANGE to accomplish this. There are other events that can be handled as seen below.

See Creating a VFP application as a service to make a VFP application survive user logon/logoff events. I haven’t tried capturing these events: please let me know if you try it.

Another Bindevent sample: Run your code in response to a new drive being inserted

Other screen saver topics:

#define WTS_CONSOLE_CONNECT 0x1

#define WTS_CONSOLE_DISCONNECT 0x2

#define WTS_REMOTE_CONNECT 0x3

#define WTS_REMOTE_DISCONNECT 0x4

#define WTS_SESSION_LOGON 0x5

#define WTS_SESSION_LOGOFF 0x6

#define WTS_SESSION_LOCK 0x7

#define WTS_SESSION_UNLOCK 0x8

#define WTS_SESSION_REMOTE_CONTROL 0x9

#define NOTIFY_FOR_ALL_SESSIONS 1

#define NOTIFY_FOR_THIS_SESSION 0

#define WM_WTSSESSION_CHANGE 0x02B1

#define GWL_WNDPROC (-4)

PUBLIC oevent

oevent=NEWOBJECT("MyEvent")

DEFINE CLASS MyEvent AS session

      dwOrigWindProc=0

      PROCEDURE init

            DECLARE integer GetWindowLong IN WIN32API ;

                  integer hWnd, ;

                  integer nIndex

            DECLARE integer CallWindowProc IN WIN32API ;

                  integer lpPrevWndFunc, ;

                  integer hWnd,integer Msg,;

                  integer wParam,;

                  integer lParam

            DECLARE integer DefWindowProc IN WIN32API ;

                  integer hWnd,integer Msg,;

                  integer wParam,;

                  integer lParam

     

            DECLARE integer WTSRegisterSessionNotification IN wtsapi32 ;

                  integer hWnd,;

                  integer flags

            DECLARE integer WTSUnRegisterSessionNotification IN wtsapi32 ;

                  integer hWnd

                 

            THIS.dwOrigWindProc =GetWindowLong(_VFP.HWnd,GWL_WNDPROC)

            BINDEVENT(_vfp.hWnd, WM_WTSSESSION_CHANGE,this,"HandleMsg")

            WTSRegisterSessionNotification(_VFP.hWnd, NOTIFY_FOR_THIS_SESSION)

      PROCEDURE destroy

            WTSUnRegisterSessionNotification(_VFP.hWnd)

      PROCEDURE HandleMsg(hWnd as Integer, msg as Integer, wParam as Integer, lParam as Integer)

            LOCAL nRetvalue,hDC

            nRetvalue=0

            DO CASE

            CASE msg=WM_WTSSESSION_CHANGE

                  ?DATETIME(),PROGRAM(),wParam

                  DO CASE

                  CASE wParam=WTS_SESSION_LOCK

                        ??"Session Lock"

                  CASE wParam=WTS_SESSION_UNLOCK

                        ??"Session UnLock"

                  ENDCASE

                  nRetvalue= CallWindowProc(this.dwOrigWindProc ,hWnd,msg,wParam,lParam)

            ENDCASE

            RETURN nRetvalue

ENDDEFINE