我尝试使用 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 小时前。所以我关闭计算机并拔掉电源,启动,但系统启动时间仍然有这么高的值。但是,重新启动计算机使其重置,现在我的代码可以工作了。
编辑2: 此博客 https://blogs.msdn.microsoft.com/oldnewthing/20141113-00/?p=43623 指出 GetTickCount 应该用于测量时间间隔,而不是我想要实现的目标。看来我得看看注册表了。
编辑3:
在注册表中找到正确的计数器后,它具有与 GetTickCount 和类似函数相同的值。 Windows 中的关闭似乎会使其进入某种休眠状态。我还没有找到任何解决方案。
GetTickCount
的文档描述了获得系统正常运行时间的正确方法:
要获取计算机启动以来经过的时间,请检索 注册表项中性能数据中的系统正常运行时间计数器 HKEY_PERFORMANCE_DATA。返回的值是一个 8 字节值。了解更多 信息,请参阅性能计数器
我也遇到了同样的问题。我解决了这个问题:
我猜很多旧程序会在 W10 和快速启动选项后再次出现 bug...
500 小时的正常运行时间并不特别令人惊讶。也就是20天左右。现代系统很少关闭。通常它们是暂停而不是关闭。我想你的系统确实已经运行了 500 小时。
当然,您应该使用
GetTickCount64
来处理 64 位滴答计数。这将避免由于 GetTickCount
返回 32 位值而导致的 49 天环绕。
我尝试使用 Windows API 中的 GetTickCount() 来获取系统正常运行时间。我想知道系统运行了多长时间。
除了其他人所说的之外,还有另一种替代解决方案。
您可以从 NtQuerySystemInformation()
调用
ntdll.dll
,将其 SystemInformationClass
参数设置为 SystemTimeOfDayInformation
,以检索包含 SYSTEM_TIMEOFDAY_INFORMATION
和 BootTime
字段作为 CurrentTime
值的 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;
您只需从
BootTime
中减去 CurrentTime
即可获得 Windows 已运行的时间(这正是任务管理器计算“系统运行时间”的方式)。