2012-06-01 21 views
9

これは単純に、c/C++を使用してWindowsでシステム起動時間を取得する方法です。このために検索プログラムでC++(ウィンドウ)でシステム起動時間を取得する

は私にすべての答えを持っていない、私は(私はその途中を読み捨てられた、言うまでもない)ファイルのタイムスタンプを読んで、本当にハックアプローチを発見しました。

私が見つけた別のアプローチは、Windows診断ログイベントを実際に読み取ることでしたか?おそらく、それは最後の起動時間を持っています。

これを行う方法を知っている人はいますか(うまくいけば、あまりにも多くの醜いハッキングはありません)?

答えて

16

GetTickCount64「は、システムが起動してから経過したミリ秒数を取得します。」

システムの稼働時間を知ると、現在の時刻からこの期間を差し引いて、起動時を判断するだけです。例えば、(ビジュアルC++ 2012でサポートされている)C++ 11クロノライブラリ使用:

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

あなたは 'GetSystemTime'であることを組み合わせて、完全な答えを日付数学のビットを行う必要があると思います質問に。 – Benj

+0

申し訳ありませんが、私が不明な場合は、実際の時間を意味しました。私。 : "2012/06/01 10:00に起動されたシステム" – Eximius

+0

Benj、それはうまくいくと思います...ありがとう。これはまだややハックですが、/ – Eximius

6

をまたブートの正確な時刻を取得するためにWMIを使用することができます。 WMIは心の弱いものではありませんが、あなたが探しているものを手に入れます。

問題の情報がLastBootUpTimeプロパティの下Win32_OperatingSystemオブジェクトの上にあります。 WMI Toolsを使用して他のプロパティを調べることができます。

WMI Explorer showing property instance

編集: 希望する場合は、コマンドラインからこの情報を取得することができます。一例として、

wmic OS Get LastBootUpTime 

C#で、それは(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

最後の "Boot Type"(シャットダウンまたは休止状態からのブートを意味します)を得ることは可能ですか? – RDX

+0

コマンドライン 'wmic OS Get LastBootUpTime'は、PCがブートされた最初の時刻を返しているようです.... ' wmic LOGON Start StartTime'はもっと便利かもしれません –

関連する問題