2012-06-01 42 views
9

Vì vậy, khá đơn giản, câu hỏi đặt ra là làm sao để có được thời gian khởi động hệ thống trong các cửa sổ với c/C++.Lập trình khởi động hệ thống trong c + + (windows)

Tìm kiếm điều này không có câu trả lời cho tôi, tôi chỉ tìm thấy một cách tiếp cận thực sự là hacky đang đọc một dấu thời gian tệp (không cần phải nói, tôi đã từ bỏ đọc nửa chừng).

Một cách tiếp cận khác mà tôi thấy thực sự là đọc các sự kiện ghi nhật ký chẩn đoán windows? Được cho là có thời gian khởi động cuối cùng.

Có ai biết cách thực hiện điều này không (với hy vọng không quá nhiều hacks xấu xí)?

Trả lời

16

GetTickCount64 "truy xuất số mili giây đã trôi qua kể từ khi hệ thống được khởi động".

Khi bạn biết hệ thống đã chạy được bao lâu, nó chỉ đơn giản là loại trừ thời gian này khỏi thời gian hiện tại để xác định thời điểm khởi động. Ví dụ, bằng cách sử dụng chrono thư viện C++ 11 (được hỗ trợ bởi Visual C++ 2012):

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

Bạn sẽ cần phải kết hợp đó với 'GetSystemTime' và làm một chút về toán học ngày cho một câu trả lời đầy đủ cho câu hỏi. – Benj

+0

Xin lỗi nếu tôi không rõ ràng, nhưng tôi có nghĩa là thời gian thực tế, không bao nhiêu thời gian trước đây. I E. : "Hệ thống khởi động lúc 2012/06/01 10:00" – Eximius

+0

Benj, tôi đoán rằng các công trình ... Cảm ơn. Điều này vẫn là một phần của một hack mặc dù:/ – Eximius

6

Bạn cũng có thể sử dụng WMI để có được thời gian chính xác của khởi động. WMI không dành cho những người yếu tim, nhưng nó sẽ giúp bạn có được những gì bạn đang tìm kiếm.

Thông tin được đề cập nằm ở đối tượng Win32_OperatingSystem trong thuộc tính LastBootUpTime. Bạn có thể kiểm tra các thuộc tính khác bằng cách sử dụng WMI Tools.

WMI Explorer showing property instance

Edit: Bạn cũng có thể nhận được thông tin này từ dòng lệnh nếu bạn thích.

wmic OS Get LastBootUpTime 

Như một ví dụ trong C# nó sẽ trông giống như sau (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

Có thể lấy Last "Boot Type" (Có nghĩa là khởi động từ tắt máy hoặc Hibernate)? – RDX

+0

Dòng lệnh 'wmic OS Get LastBootUpTime' dường như trả về thời điểm ĐẦU TIÊN mà PC đã được khởi động .... 'wmic LOGON Get StartTime' có thể hữu ích hơn –

Các vấn đề liên quan