Trong Windows 7 (và cũng có thể trong Vista/8/Server), bạn có thể sử dụng các sự kiện hệ thống để theo dõi xem Windows đang tắt (và tắt nguồn máy tính) hay chỉ khởi động lại. Mỗi lần tắt/khởi động lại (bằng bất kỳ phương tiện nào - nhấp vào nút trong menu Bắt đầu hoặc lập trình), Windows 7 viết một hoặc hai sự kiện trong Nhật ký hệ thống, nguồn USER32, ID sự kiện 1074. Bạn có thể xem các sự kiện này được ghi nếu bạn mở Trình xem sự kiện từ Công cụ quản trị (lọc Nhật ký hệ thống để chỉ xem ID 1074). Mô tả (tin nhắn) của các sự kiện này chứa kiểu tắt máy. Vì vậy, bạn có thể phân tích cú pháp mô tả về sự kiện gần đây nhất của loại này (sau khi tắt máy), tìm kiếm từ cần thiết (tắt máy, khởi động lại/khởi động lại).
Tôi không cố gắng xem kiểu tắt được viết trong trường hợp sử dụng nút nguồn để tắt Windows một cách duyên dáng (tôi thường tắt chức năng này), nhưng một số trang gợi ý rằng nó cho biết loại "tắt nguồn" thay vì "tắt máy" - vì vậy hãy kiểm tra, nếu bạn cần chắc chắn. Hoặc đơn giản là tìm kiểu "khởi động lại" - nếu nó không được tìm thấy, thì kiểu "tắt máy" được giả định.
Trong Windows XP, theo kinh nghiệm của tôi, sự kiện 1074 chỉ được ghi nếu tắt/khởi động lại được lập trình (ví dụ: trong khi cài đặt chương trình hoặc sử dụng tiện ích shutdown.exe). Vì vậy, nó không đăng ký tắt máy bắt đầu từ trình bao (Explorer), nhưng có lẽ bạn có thể kết hợp phương thức này với việc đọc giá trị từ sổ đăng ký như được đề xuất trong câu trả lời khác. Ngoài ra, hãy nhớ rằng trong WinXP thông điệp của sự kiện 1074 chứa từ "khởi động lại" bất kể loại tắt máy thực sự là gì, vì vậy bạn nên xem trường "Shutdown Type:", trạng thái sẽ "shutdown" hoặc "khởi động lại".
Liên quan đến điều này, ID sự kiện 1073 được ghi lại bất cứ khi nào Windows không tắt/khởi động lại vì lý do nào đó (ví dụ: nếu ứng dụng không cho phép tắt máy dưới dạng phản hồi với WM_QUERYENDSESSION). Trong trường hợp đó, thông báo cũng sẽ chứa các từ như "tắt máy", "khởi động lại" hoặc "tắt nguồn" - trong WinXP. Đối với Win7 loại sự kiện này ít hữu ích hơn trong trường hợp của chúng tôi, vì nó sẽ không tạo ra bất kỳ sự khác biệt nào giữa tắt máy và khởi động lại. Nhưng đối với WinXP - nếu bạn chỉ cần chặn việc tắt/khởi động lại, thực hiện một số thao tác, sau đó tiếp tục quá trình tắt hoặc khởi động lại tương ứng - nó sẽ hoạt động như mong đợi.
Đó là tất nhiên giả định rằng hệ thống hiện đang tắt vì người dùng hiện tại đã khởi chạy nó và đã làm như vậy trong Explorer. Nếu đây là một tắt chương trình, tắt máy từ một ứng dụng khác, hoặc tắt máy bởi một người dùng khác, bạn sẽ có lý do cho việc tắt máy trước đó. – MSalters
-1 Vì câu trả lời không đầy đủ và cụ thể cho Windows Explorer. Nó cũng xuất hiện để được ** gỡ bỏ ** trong Windows 7. – unixman83
Nó hoạt động tốt dưới WindowsXP nhưng không dưới Windows7 – conceptacid