Detecting Workstation state changes
I read Raymond’s post about detecting workstation events: https://blogs.msdn.com/oldnewthing/archive/2006/01/04/509194.aspx
To detect shell events, such as a new drive being added, see my blog: Run your code in response to a new drive being inserted
To detect workstation events, such as logon or session lock, run the code below which uses WTSRegisterSessionNotification. Lock the workstation (Try Windows Key + L). Unlock it. Connect/disconnect via Remote Desktop.
Tip: I edit the Remote Desktop properties (printer, password, sound properties, etc.) as I like, save them to a RDP file. I open the folder containing that file in Explorer. Just hit enter on that file to connect. Alt-Space, C to close the RD session. Voila: no low bandwidth input device (mouse) needed and minimal high bandwidth device (keyboard) input required.
#define NOTIFY_FOR_ALL_SESSIONS 1
#define NOTIFY_FOR_THIS_SESSION 0
#define WM_WTSSESSION_CHANGE 0x02B1
#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 SM_REMOTESESSION 0x1000
PUBLIC oTS
oTS = CREATEOBJECT("TS")
DEFINE CLASS TS as custom
PROCEDURE init
DECLARE integer WTSRegisterSessionNotification IN wtsapi32 integer hWnd, integer flags
DECLARE integer WTSUnRegisterSessionNotification IN wtsapi32 integer hWnd
DECLARE integer Beep IN WIN32API integer dwFreq, integer dwMillisec
DECLARE integer GetSystemMetrics IN WIN32API integer
WTSRegisterSessionNotification(_vfp.HWnd,NOTIFY_FOR_THIS_SESSION)
BINDEVENT(_VFP.hWnd, WM_WTSSESSION_CHANGE,this,"HandleMsg")
CREATE CURSOR LOG (dt t, msg c(40),Remote i)
SET REFRESH TO 2
BROWSE LAST NOWAIT
PROCEDURE HandleMsg(hWnd as Integer, msg as Integer, wParam as Integer, lParam as Integer)
LOCAL nRetvalue
nRetvalue=0
?PROGRAM(),DATETIME(),TRANSFORM(wParam,"@0x"),TRANSFORM(lParam,"@0x")," ",GetSystemMetrics(SM_REMOTESESSION)
Beep(wParam*100,400)
DO CASE
CASE wParam=WTS_CONSOLE_CONNECT
INSERT INTO LOG VALUES (DATETIME(),"WTS_CONSOLE_CONNECT",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_CONSOLE_CONNECT"
CASE wParam=WTS_CONSOLE_DISCONNECT
INSERT INTO LOG VALUES (DATETIME(),"WTS_CONSOLE_DISCONNECT",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_CONSOLE_DISCONNECT"
CASE wParam=WTS_REMOTE_CONNECT
INSERT INTO LOG VALUES (DATETIME(),"WTS_REMOTE_CONNECT",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_REMOTE_CONNECT"
CASE wParam=WTS_REMOTE_DISCONNECT
INSERT INTO LOG VALUES (DATETIME(),"WTS_REMOTE_DISCONNECT",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_REMOTE_DISCONNECT"
CASE wParam=WTS_SESSION_LOGON
INSERT INTO LOG VALUES (DATETIME(),"WTS_SESSION_LOGON",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_SESSION_LOGON"
CASE wParam=WTS_SESSION_LOGOFF
INSERT INTO LOG VALUES (DATETIME(),"WTS_SESSION_LOGOFF",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_SESSION_LOGOFF"
CASE wParam=WTS_SESSION_LOCK
INSERT INTO LOG VALUES (DATETIME(),"WTS_SESSION_LOCk",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_SESSION_LOCK"
CASE wParam=WTS_SESSION_UNLOCK
INSERT INTO LOG VALUES (DATETIME(),"WTS_SESSION_UNLOCK",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_SESSION_UNLOCK"
CASE wParam=WTS_SESSION_REMOTE_CONTROL
INSERT INTO LOG VALUES (DATETIME(),"WTS_SESSION_REMOTE_CONTROL",GetSystemMetrics(SM_REMOTESESSION))
?"WTS_SESSION_REMOTE_CONTROL"
ENDCASE
RETURN nRetvalue
PROCEDURE destroy
?PROGRAM()
WTSUnRegisterSessionNotification(_vfp.HWnd)
ENDDEFINE