在Windows 10上的GetTickCount值

我试图在Windows API中使用GetTickCount()来获得系统正常运行时间。 我想知道系统运行了多久。

但是GetTickCount的返回值非常高。 这段代码给了我超过500小时的正常运行时间。

这也适用于GetTickCount64()。

为什么这个价值如此之高?

DWORD time_ms = GetTickCount(); DWORD seconds = (time_ms / 1000) % 60; DWORD minutes = time_ms /(1000*60) % 60; DWORD hours = time_ms / (1000*60*60); stringstream ss; ss << "Hours: "; ss << hours; ss << " Minutes: "; ss << minutes; ss << " seconds: "; ss << seconds; MessageBoxA(0, ss.str().c_str(), "Uptime", 0); 

当我运行该程序,我可以看到它正在进展正确,但不能理解我将如何得到我的桌面的总正常运行时间。

谢谢

编辑 :我检查了CMD的“systeminfo”的正常运行时间,发现“系统启动时间”实际上是约500小时前。 因此,我closures了电脑,拔掉了电源,但启动但系统启动时间有这么高的价值。 但是,重新启动计算机使其重置,现在我的代码工作。

编辑2:这个博客https://blogs.msdn.microsoft.com/oldnewthing/20141113-00/?p=43623指出GetTickCount应该用于测量时间间隔比我试图实现。 好像我必须看registry。

编辑3:

在registry中find正确的计数器后,它具有与GetTickCount和类似函数相同的值。 看来,在Windows中closures带来了一些冬眠。 我还没有find任何解决办法。

GetTickCount的文档描述了系统正常GetTickCount的正确方法:

要获取计算机启动以来的时间,请在注册表项HKEY_PERFORMANCE_DATA中的性能数据中检索系统启动时间计数器。 返回的值是一个8字节的值。 有关更多信息,请参阅性能计数器

我试图在Windows API中使用GetTickCount()来获得系统正常运行时间。 我想知道系统运行了多久。

除了别人所说的之外,还有另一种解决办法。

您可以从ntdll.dll调用NtQuerySystemInformation() ,将其SystemInformationClass参数设置为SystemTimeOfDayInformation以检索包含BootTimeCurrentTime字段的SYSTEM_TIMEOFDAY_INFORMATION结构为LARGE_INTEGER值:

 typedef struct _SYSTEM_TIMEOFDAY_INFORMATION { LARGE_INTEGER BootTime; LARGE_INTEGER CurrentTime; LARGE_INTEGER TimeZoneBias; ULONG TimeZoneId; ULONG Reserved; ULONGLONG BootTimeBias; ULONGLONG SleepTimeBias; } SYSTEM_TIMEOFDAY_INFORMATION, *PSYSTEM_TIMEOFDAY_INFORMATION; 

您可以简单地从CurrentTime减去BootTime来获取Windows已经运行的时间(这正是Task Manager计算“System Up Time”的时间)。

如何获得Windows启动时间?

Task Manager如何计算Up Time,为什么不同意GetTickCount?

我只是有同样的问题。 我解决了它:

  • 使用重新启动命令而不是关闭计算机:这将执行计算机的真正重新启动,而不是像启动“快速启动”时关闭命令的“半休眠”
  • 禁用“快速启动”选项。 这个快速启动选项导致一个非重新启动的GetTickCount!

我想很多旧的程序将再次错误与W10和快速启动选项…

500小时的正常运行时间并不令人意外。 大约20天。 现代系统很少关机。 通常他们被暂停而不是关闭。 我认为你的系统已经达到了500小时。

当然,你应该使用GetTickCount64来处理64位滴答计数。 这将避免49天环绕,这是由GetTickCount返回的32位值的结果。