C# GetLastInputTime显示不可能的时间?

C# GetLastInputTime显示不可能的时间?,c#,winapi,C#,Winapi,为了确定PC是否在一定时间内未使用,我使用了Win32API.GetLastInputTime()方法。我只是从DateTime中减去它的值。现在,将它与存储在设置中的一些值进行比较 它以前工作得很好,但最近GetLastInputTime开始显示出完全荒谬的结果-它显示了未来的时间。今天我看到的是2016年7月2日 那么,有人知道发生了什么吗?GetLastInputTime如何获取时间,以及这个时间如何可能是未来的时间?我认为您不能使用DateTime。现在,因为它取决于时区 如上所述,您必

为了确定PC是否在一定时间内未使用,我使用了
Win32API.GetLastInputTime()
方法。我只是从DateTime中减去它的值。现在,将它与存储在设置中的一些值进行比较

它以前工作得很好,但最近
GetLastInputTime
开始显示出完全荒谬的结果-它显示了未来的时间。今天我看到的是2016年7月2日


那么,有人知道发生了什么吗?
GetLastInputTime
如何获取时间,以及这个时间如何可能是未来的时间?

我认为您不能使用DateTime。现在,因为它取决于时区


如上所述,您必须使用
Environment.TickCount
来获取空闲时间。

因为
GetLastInputTime
将刻度返回为
UInt32
DWORD

您可以有一个整数溢出:

经过的时间存储为DWORD值。因此,时机将会成熟 如果系统连续运行49.7天,则归零。 要避免此问题,请使用GetTickCount64函数。否则,, 比较时间时检查溢出情况

因此有未来的日期:


可能-,或者更确切地说,可能-
DateTime
类的处理有问题。请注意,2016年7月2日可以理解为2016年7月2日或2016年2月7日。但如果没有更多信息,很难判断这是否是问题所在。另一种可能性是
GetLastInputTime
返回易于耗尽的刻度:“…如果系统连续运行49.7天,时间将变为零…”;请注意,
2016年5月13日+49.7天
==
2016年7月2日
从日期时间中减去它。现在没有意义了,它产生了机器重新启动的日期。您必须将其强制转换为int并从Environment.TickCount中减去它。它生成自上次输入事件以来的毫秒数。
DateTime.Now
确实取决于时区,正如您所说。但是OP得到的结果太远了,即使是在不同的时区。问题可能不在于使用
DateTime.Now
,而在于
DateTime
的整个处理过程。无论如何,如果没有进一步的信息,这很难说。好的,我已经修改了我的代码以使用GetLastInputInfo和Environment.TickCount。感谢您概述了问题的核心。
   13 May 2016 + 49.7 days == 2 July 2016