为什么GetLastInputInfo()不返回我正在模拟的用户的信息?
GetLastInputInfo()函数总是返回当前会话中最后一个用户输入的信息,而不是模拟用户的信息。这是因为该API查询的是系统范围的输入状态,而不是与特定用户令牌关联的。即使你的线程正在模拟另一个用户,GetLastInputInfo()仍然反映的是物理控制台或远程桌面会话中最后一个活动用户的输入状态。要获取特定用户的最后输入时间,需要采用其他方法,比如挂钩输入事件并手动跟踪。
背景速读
- `GetLastInputInfo()` 是 Windows 系统函数,返回用户最后一次键盘或鼠标操作的时间戳。它常用于检测屏幕保护、锁屏或用户是否“离开座位”。
- 文章核心问题是:如果程序通过 `ImpersonateLoggedOnUser()` 模拟(impersonate)了另一个用户,`GetLastInputInfo()` 为什么不返回被模拟用户的最后输入时间,而仍然返回原始用户的信息?
- 关键机制:Windows 的“模拟”机制允许一个线程以另一个用户的身份执行操作(如访问文件),但 `GetLastInputInfo()` 读取的是与当前物理会话(session)关联的全局输入计数器,而非调用线程所模拟的用户。
- 背景知识:模拟(impersonation)与桌面会话(desktop session)是不同的概念。`GetLastInputInfo()` 按会话 ID(session ID)区分输入事件,不按用户令牌(token)区分。因此模拟不会改变返回的结果。
- 影响:开发者若在模拟用户后误用此 API 判断用户活跃度,会得到错误结论,需改用其他方式(如检查目标用户的桌面输入队列)。