代码之家  ›  专栏  ›  技术社区  ›  Peter Rawytsch

WTS\U SESSIONSTATE\u UNKNOWN和WTS\U SESSIONSTATE\u LOCK之间有什么区别?

  •  0
  • Peter Rawytsch  · 技术社区  · 7 年前

    我正在尝试使用 Win32 API ::WTSQuerySessionInformation 通过查询 会话标志 WTSINFOEX_LEVEL1 根据以下问题的答案构建 C++: check if computer is locked

    在我的计算机上(Windows 10 1703) SessessionFlags 只能达到两个(三个记录的)值: WTS\u会话状态\u解锁 WTS\u SESSIONSTATE\u未知 .后者的含义似乎与预期的相同 WTS\u SESSIONSTATE\u锁 我无法到达,也无法通过 <WinKey>+<L> 也不是通过编程方式通过 ::LockWorkStation

    所以我的问题是:

    1. WTS\u SESSIONSTATE\u锁 存在
    2. 如果是,那么我如何才能达到那种状态?
    3. 如果是,两个州之间的区别是什么( LOCK UNKNOWN )?

    根据 SessionChangeReason Enumeration 这个NET Framework区分(正确吗?)仅在两个对应状态之间 SessionUnlock 会话取消锁定 那么会话的状态是三重还是二进制?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anders    7 年前

    人们会认为 WTS_SESSIONSTATE_UNKNOWN 表示状态未知,不应将其解释为锁定或解锁。MSDN表示,这个成员似乎有一段令人遗憾的历史

    Windows Server 2008 R2和Windows 7: 由于代码缺陷,WTS\U SESSIONSTATE\u LOCK和WTS\U SESSIONSTATE\u UNLOCK标志的使用被颠倒了。也就是说,WTS\U SESSIONSTATE\u LOCK表示会话已解锁,WTS\U SESSIONSTATE\u UNLOCK表示会话已锁定。

    因为成员名为Session 标志 MSDN表示“这可能是以下一个或多个值”可以想象,随着时间的推移,可以添加更多的标志,您实际上应该这样做:

    isUnlocked = SessionFlags & WTS_SESSIONSTATE_UNLOCK;
    

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

    在我的Windows 8和10.0.17134计算机上,它会返回 WTS_SESSIONSTATE_UNLOCK 正常和 WTS_SESSIONSTATE_LOCK 当我按下 Win+L 那么你有没有可能做错了什么?

    我不知道如果Windows 7+机器试图询问Vista机器会发生什么,也许你会 WTS\u SESSIONSTATE\u未知 或者整个调用都失败了,因为Vista不支持 WTSSessionInfoEx

    您链接到的问题中的公认答案告诉您使用 WTSRegisterSessionNotification 它将为您提供与 SessionChangeReason 而且你不必拉来检测变化。