了解自上次程序运行以来计算机是否重新启动?

时间:2009-11-11 20:41:59

标签: windows winapi

我的程序如何知道自上次运行以来Windows是否重新启动?所有版本的Windows XP及以上版本。

8 个答案:

答案 0 :(得分:6)

这可以使用global atom table轻松完成。只要确保你的原子名称不太可能与另一个原子发生冲突。

if (GlobalFindAtom ("MySecretName") == 0)
{
  // First time run since reboot
  GlobalAddAtom ("MySecretName");
}

答案 1 :(得分:3)

您可以使用名为GetTickCount的Windows API调用...

http://msdn.microsoft.com/en-us/library/ms724408%28VS.85%29.aspx

编辑这个想法是,当你的程序启动时,你调用GetTickCount(它返回Windows运行了几毫秒),然后计算一个确切的开始日期(现在减去毫秒数。存储该日期,然后在下次程序启动时,再次计算日期并将其与先前存储的日期进行比较。如果日期不同,Windows已重新启动。如果可能,请使用GetTickCount64(但不要仅使用此功能对解决方案进行编码。

答案 2 :(得分:1)

您可以使用WMI:

    strComputer = "."
Set objWMIService = GetObject _
    ("winmgmts:\\" & strComputer & "\root\cimv2")
Set colOperatingSystems = objWMIService.ExecQuery _
    ("Select * from Win32_OperatingSystem")
For Each objOS in colOperatingSystems
    dtmBootup = objOS.LastBootUpTime
    dtmLastBootupTime = WMIDateStringToDate(dtmBootup)
    dtmSystemUptime = DateDiff("h", dtmLastBootUpTime, Now)
    Wscript.Echo dtmSystemUptime
Next
Function WMIDateStringToDate(dtmBootup)
    WMIDateStringToDate = CDate(Mid(dtmBootup, 5, 2) & "/" & _
         Mid(dtmBootup, 7, 2) & "/" & Left(dtmBootup, 4) _
         & " " & Mid (dtmBootup, 9, 2) & ":" & _
         Mid(dtmBootup, 11, 2) & ":" & Mid(dtmBootup, _
         13, 2))
End Function

答案 3 :(得分:1)

net statistics workstation|find "Statistics since"

答案 4 :(得分:1)

Microsoft实用程序uptime.exe“处理计算机的事件日志以确定系统可用性和当前正常运行时间”。

答案 5 :(得分:0)

简单但丑陋的解决方案:只需启动一个永无止境的虚拟过程: - )

如果它还在这里,你没有重启。如果不是,那么你很可能刚刚重新启动。

答案 6 :(得分:0)

在丑陋的黑客行为中......在RunOnce注册表项中添加一些内容

答案 7 :(得分:0)

如何将文件添加到%TMP%并检查它是否仍然存在(Windows每次重启时都应清除%TMP%

更强大的方式,在某处创建文件并在下次重新启动时将其标记为删除(请参阅MoveFileEx API)并检查该文件