为什么 GetLastInputInfo() 不返回我正在模拟的用户的信息?
GetLastInputInfo() 函数始终返回当前登录会话(session)中物理控制台的输入信息,而不是被模拟(impersonation)用户的输入状态。即使你的线程模拟了另一个用户,该函数仍然读取原始会话的输入数据。这是因为 GetLastInputInfo() 设计上基于会话(session)而非用户(user)来跟踪输入活动。
背景速读
- **GetLastInputInfo()** 是 Windows 的一个系统 API,用来查询系统最后一次收到用户输入(键盘、鼠标等)的时间。常用于判断用户是否 "离开"(屏保、锁屏、闲置检测)。
- **模拟(Impersonation)** 是指一个线程临时采用另一个用户的身份来执行操作(比如服务程序模拟登录用户去访问资源)。
- 文章解释了一个容易困惑的细节:即便你的线程正在模拟另一个用户,`GetLastInputInfo()` 永远返回的是**物理控制台会话**(即真正坐在屏幕前那个人)的最后输入时间,而不是被模拟用户的。
- 原因在于该函数查询的是全局的输入状态,而不是线程模拟的身份。这是 Windows 安全/会话模型的设计决策:闲置检测基于谁在物理操作机器,而不是代码以谁的身份运行。