2012-06-01 8 views
9

Così semplicemente, la domanda è come ottenere il tempo di avvio del sistema in Windows con c/C++.Avvio programmatico all'avvio del sistema in C++ (windows)

La ricerca di questo non mi ha dato alcuna risposta, ho solo trovato un approccio veramente hacky che sta leggendo un timestamp di file (inutile dire che ho abbandonato la lettura a metà strada).

Un altro approccio che ho trovato era in realtà la lettura degli eventi registrati di diagnostica di Windows? Presumibilmente che ha l'ultimo avvio del tempo.

Qualcuno sa come fare questo (con forse non troppi hack brutti)?

risposta

16

GetTickCount64 "recupera il numero di millisecondi che sono trascorsi dall'avvio del sistema."

Una volta stabilito per quanto tempo il sistema è stato in esecuzione, si tratta semplicemente di sottrarre questa durata dall'ora corrente per determinare quando è stato avviato. Ad esempio, utilizzando la libreria C++ 11 crono (supportato da Visual C++ 2012):

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

avresti bisogno di combinare che con 'GetSystemTime' e fare un po 'di matematica per data una risposta completa alla domanda – Benj

+0

Scusa se non sono stato chiaro, ma intendevo il tempo reale, non quanto tempo fa. Cioè : "Sistema avviato al 2012/06/01 10:00" – Eximius

+0

Benj, immagino che funzioni ... Grazie. Questo è comunque un po 'un trucco:/ – Eximius

6

È anche possibile utilizzare WMI per ottenere l'ora esatta del caricamento del sistema. WMI non è per i deboli di cuore, ma ti farà ottenere ciò che stai cercando.

Le informazioni in questione si trovano sull'oggetto Win32_OperatingSystem nella proprietà LastBootUpTime. È possibile esaminare altre proprietà utilizzando WMI Tools.

WMI Explorer showing property instance

Edit: È inoltre possibile ottenere queste informazioni dalla riga di comando, se si preferisce.

wmic OS Get LastBootUpTime 

Per fare un esempio in C# che sarebbe simile al seguente (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

È possibile ottenere l'ultimo "Tipo di avvio" (significa avvio da arresto o sospensione)? – RDX

+0

La riga di comando 'wmic OS Get LastBootUpTime' sembra restituire la prima volta che il PC è stato avviato .... ' wmic LOGON Get StartTime' potrebbe essere più utile –

Problemi correlati