【发布时间】:2009-11-12 22:21:46
【问题描述】:
我的程序如何知道自上次运行以来 Windows 是否重新启动?所有版本的 Windows XP 及更高版本。
【问题讨论】:
我的程序如何知道自上次运行以来 Windows 是否重新启动?所有版本的 Windows XP 及更高版本。
【问题讨论】:
这可以使用global atom table 轻松完成。只需确保您的 atom 名称不太可能与另一个 atom 冲突。
if (GlobalFindAtom ("MySecretName") == 0)
{
// First time run since reboot
GlobalAddAtom ("MySecretName");
}
【讨论】:
您可以调用 Windows API 调用 GetTickCount...
http://msdn.microsoft.com/en-us/library/ms724408%28VS.85%29.aspx
编辑:这个想法是,当你的程序启动时,你调用 GetTickCount(它返回 Windows 已经运行了多少毫秒),然后计算一个确切的开始日期(现在减去毫秒数)。存储该日期,然后下次程序启动时,再次计算日期并将其与之前存储的日期进行比较。如果日期不同,则 Windows 已重新启动。如果可能,请使用GetTickCount64(但不要仅使用此函数编写解决方案。
【讨论】:
last_ticks >> current_ticks)。另一个限制是它只计算最多 49.7 天。
GetTickCount64() 避免在正常运行约 50 天后出现包装问题。 msdn.microsoft.com/en-us/library/ms724411%28VS.85%29.aspx
您可以使用 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
【讨论】:
net statistics workstation|find "Statistics since"
【讨论】:
Microsoft 实用程序uptime.exe“处理机器的事件日志以确定系统可用性和当前正常运行时间”。
【讨论】:
简单但丑陋的解决方案:只需启动一个永无止境的虚拟进程 :-)
如果它仍然在这里,则说明您没有重新启动。如果不是,很可能您刚刚重新启动。
【讨论】:
在丑陋的黑客中......在RunOnce 注册表项之一中粘贴一些东西
【讨论】:
如何将文件添加到 %TMP% 并检查它是否仍然存在(%TMP% 应该在 Windows 每次重新启动时清除)
或
更健壮的方法,在某处创建一个文件并在下次重新启动时将其标记为删除(请参阅MoveFileEx API)并检查该文件
【讨论】:
MoveFileEx() 可以与MOVEFILE_DELAY_UNTIL_REBOOT 一起使用 仅当进程在属于管理员组或 LocalSystem 帐户的用户的上下文。