Узнайте, перезагрузился ли компьютер с момента последнего запуска моей программы - PullRequest
3 голосов
/ 11 ноября 2009

Как моя программа может узнать, перезагрузились ли окна с момента последнего запуска? Все версии Windows XP и выше.

Ответы [ 8 ]

6 голосов
/ 12 ноября 2009

Это можно сделать тривиально, используя глобальную таблицу атомов . Просто убедитесь, что имя вашего атома вряд ли будет конфликтовать с другим атомом.

if (GlobalFindAtom ("MySecretName") == 0)
{
  // First time run since reboot
  GlobalAddAtom ("MySecretName");
}
3 голосов
/ 11 ноября 2009

Вы можете выполнить вызов API Windows, который называется GetTickCount ...

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

Редактировать: Идея состоит в том, что, когда ваша программа запускается, вы вызываете GetTickCount (который возвращает количество запущенных Windows миллисекунд), а затем вычисляете точную дату начала (прямо сейчас за вычетом количество миллисекунд). Сохраните эту дату, а затем при следующем запуске вашей программы снова рассчитайте дату и сравните ее с ранее сохраненной датой. Если даты разные, Windows перезагрузилась. Если возможно, используйте GetTickCount64 (но не кодируйте свое решение исключительно с помощью этой функции.

1 голос
/ 12 ноября 2009

Утилита Microsoft uptime.exe"обрабатывает журнал событий компьютера для определения доступности системы и текущего времени безотказной работы".

1 голос
/ 11 ноября 2009
net statistics workstation|find "Statistics since"
1 голос
/ 11 ноября 2009

Вы можете использовать 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
0 голосов
/ 12 ноября 2009

Как насчет добавления файла в% TMP% и проверки его наличия (% TMP% должен очищаться при каждой перезагрузке Windows)

или

более надежным способом, создайте файл где-нибудь и отметьте его для удаления при следующей перезагрузке (см. MoveFileEx API) и проверьте этот файл

0 голосов
/ 12 ноября 2009

В духе уродливых хаков ... вставьте что-нибудь в один из RunOnce ключей реестра

0 голосов
/ 12 ноября 2009

Простое, но безобразное решение : просто запустите бесконечный фиктивный процесс: -)

Если он все еще здесь, вы не перезагрузились. Если это не так, скорее всего, вы только что перезагрузились.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...