WTS_SESSIONSTATE_UNKNOWN和WTS_SESSIONSTATE_LOCK有什么区别?

时间:2018-05-09 14:49:41

标签: winapi visual-c++

我正在尝试使用 Win32 API ::WTSQuerySessionInformation函数通过查询WTSINFOEX_LEVEL1结构的 SessionFlags 来确定当前会话状态。 C++: check if computer is locked的答案。

在我的计算机上(Windows 10 1703) SesssionFlags 只能达到两个(记录在案的三个)值: WTS_SESSIONSTATE_UNLOCK WTS_SESSIONSTATE_UNKNOWN 。后者似乎与预期的 WTS_SESSIONSTATE_LOCK 相同,我无法通过<WinKey>+<L>或通过::LockWorkStation以编程方式锁定会话来达到。

所以我的问题是:

  1. WTS_SESSIONSTATE_LOCK 是否存在?
  2. 如果是,那我怎样才能达到那个状态?
  3. 如果是,两个州(LOCKUNKNOWN)之间有什么区别?
  4. 根据SessionChangeReason Enumeration,.NET Framework仅在两个相应的状态SessionUnlockSessionUnlock之间区分(正确?)。那么会话的状态是三倍还是二进制?

1 个答案:

答案 0 :(得分:1)

有人会认为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表示&#34;这可以是以下一个或多个值&#34;可以想象随着时间的推移可以添加更多的标志,你应该真的这样做:

isUnlocked = SessionFlags & WTS_SESSIONSTATE_UNLOCK;

(在Windows 7上反转逻辑)。我不认为有人会这样做,所以我怀疑微软会不会添加更多的旗帜,但你永远不会知道。

在我的Windows 8和10.0.17134计算机上,当我按 Win + L 时,它会正常返回WTS_SESSIONSTATE_UNLOCKWTS_SESSIONSTATE_LOCK,所以你可能做错了吗? / p>

我不知道如果Windows 7+计算机试图询问Vista计算机会发生什么,可能是WTS_SESSIONSTATE_UNKNOWN或者整个通话失败,因为Vista不支持WTSSessionInfoEx

您链接到的问题中的已接听答案会告诉您使用WTSRegisterSessionNotification,它会为您提供与SessionChangeReason相同的值,而您无需提取以检测更改。