GetLastInputInfo API没有';如果windows被设置为“0”;“自动登录”;

本文关键字:自动登录 登录 没有 API 如果 GetLastInputInfo windows 设置 | 更新日期: 2023-09-27 17:57:51

我使用对GetLastInputInfo的Windows API调用来确定系统是否空闲。这几乎适用于任何情况,除非Windows设置为绕过用户名/密码并自动登录。

在这种情况下,查询GetLastInputInfo总是返回0。在正常情况下,它将返回上次输入发生时的系统刻度计数。

有人知道为什么吗?或者有人知道确定windows会话是否空闲的替代方法吗?

编辑

这就是编写代码以检测当前系统空闲时间的方式。检测发生在计时器上,无论计时器运行多长时间,GetLastInputInfo都将始终返回0,而窗口设置为"0";自动登录";。

long lastInputTicks = 0;
long idleTicks = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
if (GetLastInputInfo(ref lastInputInfo)) {
   lastInputTicks = lastInputInfo.dwTime;
   var systemUptime = GetTickCount();
   idleTicks = systemUptime - lastInputTicks;
}
return new TimeSpan(0, 0, (int)(idleTicks / 1000));

感谢

更新

我已经确认,这只是因为代码在服务中运行。

澄清一下:在不使用自动登录的正常情况下,用户在控制台登录,即使作为服务运行,上述代码也会返回正确的用户非活动时间。

但是,如果启用了自动登录,则windows会话似乎不会作为典型的控制台会话运行,因此不会被跟踪。这仅适用于从服务而不是从"服务"运行代码的情况;用户空间"-如果从用户空间运行,它在所有情况下都非常有效。

也就是说,我真的很想找到一个在任何情况下都能从服务中工作的解决方案。

GetLastInputInfo API没有';如果windows被设置为“0”;“自动登录”;

GetLastInput()返回FALSE时返回0秒。这显然是不正确的。您不能在服务中使用这样的代码,因为它没有检索用户输入的方法。如果GetLastInput()返回FALSE(可能是自动登录),那么它将永远返回FALSE。

让服务知道用户会话是一个失败的原因在Windows中,服务在自己的会话中运行,不需要用户登录。这是首先使用服务的主要原因。而不是用启动文件夹中的快捷方式启动的程序。这段代码可能在XP中意外运行,但在Vista和Windows7中肯定不会运行。谷歌"会话0隔离"了解更多详细信息。

文档的备注部分大致解释了它不起作用的原因:

此功能对于输入空闲检测非常有用。但是,GetLastInputInfo并没有在所有正在运行的会话中提供系统范围的用户输入信息。相反,GetLastInputInfo只为调用函数的会话提供会话特定的用户输入信息

就是这样。