如何获取Windows系统的启动时间?

3

如何使用一些WinAPI函数在C++中获取Windows的启动时间?我目前正在使用命令“systeminfo”,但我正在寻找更加合适的解决方案。


应该只是 System::Environment::TickCount,对吧? - BonzaiThePenguin
1
"正规的"代码应该使用 WMI 来检索此类信息。Win32_OperatingSystem 类,LastBootUpTime 属性。但是当 C++ 程序员发现编写 WMI 查询所需的内容时,它往往不再被认为是“正规的”了。或者说并不是那么必要 :) - Hans Passant
相关链接:http://stackoverflow.com/questions/2453191/how-get-win32-operatingsystem-lastbootuptime-in-datetime-format - David Heffernan
你能告诉我这个问题有什么问题,以至于它会被踩吗? - Paul
1个回答

4

我查看了任务管理器的实现方式,发现它使用了ZwQuerySystemInformation(SystemTimeOfDayInformation, ...)函数,并接收了SYSTEM_TIMEOFDAY_INFORMATION结构体。

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 是您要查找的内容。

如果想要更详细的信息,我认为可以使用 GetTickCount64


这似乎很不可能是真的。返回的值如何同时用于为随机数生成器生成不可预测的种子,以及读取系统启动时间? - David Heffernan
那是用于测量经过时间的代码。问题要求计算系统启动所花费的时间,这是不同的。 - David Heffernan
或者也许所要求的是系统启动的时间。无论如何,您的答案都没有解决这个问题。 - David Heffernan
我认为是后者。我所说的是这个 - Paul
1
请注意,ZwQuerySystemInformation在Windows 8中已不再可用(https://msdn.microsoft.com/en-us/library/windows/desktop/ms725506(v=vs.85).aspx); 此外,MSDN上建议使用的替代方法SystemTimeOfDayInformationCryptGenRandom...这并不能帮助获取启动时间。 - Andy
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接