8

How to detect Windows is locked (Win+L or locked by screensaver)? Is it possible?

Charles Sungkono
  • 145
  • 2
  • 10
  • This is an old question, but there are new answer: [For windows 7 and abowe WTS API can be used](https://stackoverflow.com/a/32115698/2148229) – Oleg Korzhukov Aug 21 '19 at 13:51

2 Answers2

13

There is no documented way to check if the session is locked. There is however a way to detect that the session is getting locked. Use WTSRegisterSessionNotification(), you'll get a WM_WTSSESSION_CHANGE message with the WTS_SESSION_LOCK value when the workstation is being locked.

If you are planning to do this from a service then be sure to google "session 0 isolation" to find out why that doesn't work.

Hans Passant
  • 922,412
  • 146
  • 1,693
  • 2,536
  • Thanks! Now I'm reading this link http://support.microsoft.com/kb/310153. I will try the code later. – Charles Sungkono Dec 22 '11 at 16:15
  • 4
    Using `WTSRegisterSessionNotification()` is the only option. MSDN says as much (see http://msdn.microsoft.com/en-us/library/windows/desktop/aa376875.aspx): "There is no function you can call to determine whether the workstation is locked. To receive notification when the user logs in, use the `WTSRegisterSessionNotification()` function to receive `WM_WTSSESSION_CHANGE` messages." Services that use a `HandlerEx` SCM callback, as opposed to a `Handler` SCM callback, can receive `SERVICE_CONTROL_SESSIONCHANGE` notifications from `WTSRegisterSessionNotification()`. – Remy Lebeau Dec 22 '11 at 18:47
1

WTSRegisterSessionNotification() will require the elevated privileges on Windows 10/11.

Call WTSQuerySessionInformation with WTS_INFO_CLASS set to WTSSessionInfoEx.

struct _WTSINFOEX_LEVEL1_A has a member, LONG SessionFlags, which indicates whether the calling session is locked or not.

Morikawa
  • 11
  • 1