Можно подумать, что WTS_SESSIONSTATE_UNKNOWN
означает, что состояние неизвестно, и вы не должны интерпретировать его как заблокированный или разблокированный. Похоже, у этого участника есть печальная история, MSDN говорит
Windows Server 2008 R2 и Windows 7: Из-за дефекта кода использование флагов WTS_SESSIONSTATE_LOCK и WTS_SESSIONSTATE_UNLOCK изменяется на противоположное. То есть WTS_SESSIONSTATE_LOCK указывает, что сеанс разблокирован, а WTS_SESSIONSTATE_UNLOCK указывает, что сеанс заблокирован.
Поскольку член называется Session Flags , а MSDN говорит: «Это может быть одно или несколько из следующих значений», можно предположить, что со временем может быть добавлено больше флагов, и вы должны это делать:
isUnlocked = SessionFlags & WTS_SESSIONSTATE_UNLOCK;
(и логика полностью изменилась в Windows 7). Я не думаю, что кто-то делает это, поэтому я сомневаюсь, что Microsoft когда-либо добавит больше флагов, но вы никогда не знаете.
На моих машинах с Windows 8 и 10.0.17134 он возвращает WTS_SESSIONSTATE_UNLOCK
нормально и WTS_SESSIONSTATE_LOCK
, когда я нажимаю Win + L , поэтому возможно, что вы делаете что-то не так?
Я не знаю, что случится, если машина с Windows 7+ попытается запросить машину с Vista, может быть, вы получите WTS_SESSIONSTATE_UNKNOWN
или, возможно, весь вызов не будет выполнен, потому что Vista не поддерживает WTSSessionInfoEx
.
Принятый ответ на вопрос, с которым вы связались, говорит вам использовать WTSRegisterSessionNotification
, и он предоставит вам те же значения, что и SessionChangeReason
, и вам не нужно тянуть, чтобы обнаружить изменения.