gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:26:56 32 4
gpt4 key购买 nike

我知道当 Windows 关闭时,它会发送一个 WM_QUERYENDSESSION给每个应用程序的消息。这样可以轻松检测 Windows 何时关闭。但是,是否有可能知道计算机是要关机还是在 Windows 关机后重新启动。

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

最佳答案

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

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

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

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

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

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com