我正在尝试使用 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
以编程方式锁定会话来达到。
所以我的问题是:
LOCK
和UNKNOWN
)之间有什么区别?根据SessionChangeReason Enumeration,.NET Framework仅在两个相应的状态SessionUnlock
和SessionUnlock
之间区分(正确?)。那么会话的状态是三倍还是二进制?
答案 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_UNLOCK
并WTS_SESSIONSTATE_LOCK
,所以你可能做错了吗? / p>
我不知道如果Windows 7+计算机试图询问Vista计算机会发生什么,可能是WTS_SESSIONSTATE_UNKNOWN
或者整个通话失败,因为Vista不支持WTSSessionInfoEx
。
您链接到的问题中的已接听答案会告诉您使用WTSRegisterSessionNotification
,它会为您提供与SessionChangeReason
相同的值,而您无需提取以检测更改。