c++ - 如何检测 Windows 是否正在关闭或重新启动

标签 c++ winapi api shutdown restart

我知道当 Windows 关闭时,它会发送一个 WM_QUERYENDSESSION给每个应用程序的消息。这样可以很容易地检测到 Windows 何时关闭。但是,是否可以知道计算机在 Windows 关闭后是否会关机或是否会重新启动。

考虑到 MSDN 上的文档对 WM_QUERYENDSESSION 有这样的说法,我不是特别抱有希望:“...无法确定正在发生的事件,”但是 stackoverflow 的累积智慧永远让我感到惊讶。

最佳答案

在 Windows 7(可能还有 Vista/8/Server)中,您可以使用系统事件来跟踪 Windows 是正在关闭(并关闭计算机电源)还是只是重新启动。每次启动关机/重新启动(通过任何方式 - 单击“开始”菜单中的按钮,或以编程方式),Windows 7 都会在系统日志中写入一个或两个事件,源 USER32,事件 ID 1074。您可以看到这些事件记录如果您从管理工具打开事件查看器(过滤系统日志以仅查看 ID 1074)。这些事件的描述(消息)包含关机类型。因此,您可以解析此类最近事件的描述(在启动关机后),寻找必要的词(关机、重启/重启)。

当使用电源按钮正常关闭 Windows 时,我没有尝试查看事件中写的关机类型(我通常禁用此功能),但一些网站建议它声明“关机”类型而不是“shutdown"- 如果需要确定,请检查一下。或者简单地寻找“重启”类型 - 如果未找到,则假定为“关机”类型。

在 Windows XP 中,根据我的经验,仅当关闭/重新启动以编程方式完成时(例如,在程序安装期间或使用 shutdown.exe 实用程序),才会记录事件 1074。因此它不会注册从 shell (Explorer) 启动的关闭,但也许您可以将此方法与另一个答案中建议的从注册表中读取值结合起来。此外,请记住,在 WinXP 中,事件 1074 的消息包含“重新启动”一词,无论真正的关机类型是什么,因此您应该查看“关机类型:”字段,该字段将说明“关机”或“重启”。

与此相关,每当 Windows 由于某种原因(例如,如果应用程序不允许关闭作为对 WM_QUERYENDSESSION 的响应)无法关闭/重新启动时,都会记录事件 ID 1073。在这种情况下,消息还将包含“关机”、“重新启动”或“关闭电源”等字样 - 在 WinXP 中。对于 Win7,这种类型的事件在我们的例子中用处不大,因为它不会在关机和重启之间产生任何区别。但对于 WinXP——如果你只需要拦截关机/重启,执行一些操作,然后继续相应的关机或重启过程——它应该可以按预期工作。

关于c++ - 如何检测 Windows 是否正在关闭或重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12035397/

相关文章:

python - 将 std::vector 作为 numpy 数组返回给 python

c++ - 在 C++ 中调用链表函数

c# - 为什么C#有static Main()而C++没有static main

Python win32api 发送消息

winapi - 可等待定时器还是定时器队列?各自的优点和缺点?

c++ - 如何记住监控应用程序所在的位置?

iphone - 如何为移动应用程序设计安全的 API/身份验证以访问服务?

c++ - 使用 llvm::Linker 以编程方式查找未解析的外部对象

api - Quick Books API playground - 开发应用只能订阅沙盒公司

javascript - Google App 脚本 : URLFetchApp. 带 header 获取