以c ++(windows)编程方式获取系统启动时间

Exi*_*ius 12 c c++ windows

很简单,问题是如何使用c/c ++在Windows中启动系统启动时间.

搜索这个没有得到任何答案,我只找到了一个非常hacky的方法,即读取文件时间戳(不用说,我放弃了中途阅读).

我发现的另一种方法实际上是读取Windows诊断记录的事件?据说那是最后一次启动时间.

有谁知道怎么做(希望不是太多丑陋的黑客)?

Jam*_*lis 19

GetTickCount64 "检索自系统启动以来经过的毫秒数."

一旦知道系统运行了多长时间,只需从当前时间减去此持续时间即可确定系统何时启动.例如,使用C++ 11 chrono库(Visual C++ 2012支持):

auto uptime = std::chrono::milliseconds(GetTickCount64());
auto boot_time = std::chrono::system_clock::now() - uptime;
Run Code Online (Sandbox Code Playgroud)

  • 我不认为_subtraction_是一个黑客. (6认同)
  • 我称之为_programming_就像大多数情况一样 - 从你拥有的数据中综合你需要的数据...... (4认同)
  • 这是否可靠地每次产生相同的结果?如果`system_clock :: now`的tick与`GetTickCount64`没有完全同步,或者两个代码行之间发生了勾号怎么办?我需要一些可以用作查找键的东西. (2认同)

lin*_*r27 7

您还可以使用WMI获取准确的启动时间.WMI不适合胆小的人,但它会让你得到你想要的东西.

有问题的信息是在财产Win32_OperatingSystem下的对象上LastBootUpTime.您可以使用WMI工具检查其他属性.

WMI Explorer显示属性实例

编辑: 如果您愿意,也可以从命令行获取此信息.

wmic OS Get LastBootUpTime
Run Code Online (Sandbox Code Playgroud)

作为C#中的一个例子,它看起来如下(使用C++它相当冗长):

static void Main(string[] args)
{      
    // Create a query for OS objects
    SelectQuery query = new SelectQuery("Win32_OperatingSystem", "Status=\"OK\"");

    // Initialize an object searcher with this query
    ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);

    string dtString;
    // Get the resulting collection and loop through it
    foreach (ManagementObject envVar in searcher.Get())
        dtString = envVar["LastBootUpTime"].ToString();
}
Run Code Online (Sandbox Code Playgroud)