2012-06-01 14 views
9

Po prostu, pytanie brzmi, jak uzyskać czas uruchamiania systemu w oknach z c/C++.Programowe uzyskiwanie czasu uruchamiania systemu w języku C++ (Windows)

Szukanie tego nie dało mi żadnej odpowiedzi, znalazłem tylko naprawdę hackowskie podejście, które czyta znacznik pliku pliku (nie muszę dodawać, że porzuciłem czytanie w połowie).

Innym podejściem, które znalazłem, było czytanie zarejestrowanych zdarzeń diagnostyki systemu Windows? Podobno ma to ostatni czas rozruchu.

Czy ktoś wie, jak to zrobić (mając nadzieję, że nie za dużo brzydkich hacków)?

Odpowiedz

16

GetTickCount64 "pobiera liczbę milisekund, które upłynęły od uruchomienia systemu."

Gdy już wiesz, jak długo system jest uruchomiony, jest to po prostu kwestia odjęcia tego czasu od bieżącego czasu, aby określić, kiedy został uruchomiony. Na przykład, przy użyciu biblioteki C++ 11 chrono (obsługiwanego przez Visual C++ 2012):

auto uptime = std::chrono::milliseconds(GetTickCount64()); 
auto boot_time = std::chrono::system_clock::now() - uptime; 
+0

trzeba by połączyć to z 'GetSystemTime' i zrobić trochę nieaktualne matematyki na pełną odpowiedź do pytania. – Benj

+0

Przepraszam, jeśli byłem niejasny, ale miałem na myśli rzeczywisty czas, a nie ile czasu temu. To znaczy. : "System uruchomił się w dniu 2012/06/01 10:00" – Eximius

+0

Benj, myślę, że to działa ... Dzięki. To nadal jest nieco hack:/ – Eximius

6

Można również użyć WMI aby uzyskać dokładny czas rozruchu. WMI nie jest dla osób o słabym sercu, ale dostarczy ci tego, czego szukasz.

Podane informacje znajdują się na obiekcie Win32_OperatingSystem pod właściwością LastBootUpTime. Możesz sprawdzić inne właściwości za pomocą WMI Tools.

WMI Explorer showing property instance

Edit: Można również uzyskać te informacje z linii poleceń, jeśli wolisz.

wmic OS Get LastBootUpTime 

Jako przykład w C# to będzie wyglądać następująco (Using C++ it is rather verbose):

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(); 
} 
+0

Czy jest możliwe uzyskanie ostatniego "typu rozruchu" (oznacza uruchamianie z wyłączenia lub hibernacji)? – RDX

+0

Linia komend 'wmic OS Get LastBootUpTime' wydaje się zwracać PIERWSZY czas uruchomienia komputera .... ' wmic LOGON Get StartTime' może być bardziej użyteczny –

Powiązane problemy