gpt4 book ai didi

c# - 如果窗口设置为 "Automatic Login",则 GetLastInputInfo API 不起作用

转载 作者:行者123 更新时间:2023-11-30 15:44:17 34 4
gpt4 key购买 nike

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

在这种情况下,查询 GetLastInputInfo始终返回 0。在正常情况下,它会在最后一次输入发生时返回系统滴答计数。

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

编辑

检测当前系统空闲时间的代码是这样写的。检测发生在计时器上,无论计时器运行多长时间,当窗口设置为“自动登录”时,GetLastInputInfo 将始终返回 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 session 似乎不会作为典型的控制台 session 运行,因此不会被跟踪。这仅适用于代码从服务而不是从“用户空间”运行的情况 - 如果从用户空间运行,它在所有情况下都适用。

也就是说,我真的很想找到一种解决方案,通过服务在所有情况下都能正常工作。

最佳答案

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

让服务知道用户 session 在 Windows 中是一个失败的原因,服务在它自己的 session 中运行并且不需要用户登录。这是首先使用服务的主要原因。而不是以启动文件夹中的快捷方式启动的程序。这段代码可能在 XP 中偶然起作用,但在 Vista 和 Windows 7 中肯定不起作用。谷歌“session 0 isolation”了解更多详细信息。

关于c# - 如果窗口设置为 "Automatic Login",则 GetLastInputInfo API 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6146114/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com