【问题标题】:Windows notifications when hibernation fails休眠失败时的 Windows 通知
【发布时间】:2012-07-06 22:09:14
【问题描述】:

我正在使用带有 WinAPI 的 C++ 进行编码,为了使计算机休眠,我使用以下调用:

SetSuspendState(TRUE, NULL, FALSE);

但是如果计算机安装了更大的 RAM 阵列,则休眠会失败。

所以我想知道,如果休眠失败,Windows 会发送任何通知吗?如果没有,如何判断我的休眠请求是否失败?

【问题讨论】:

  • 您使用NULL 作为第二个参数(FALSE 在技术上更正确,因为它是BOOLEAN)。应用程序是否有可能阻止该操作,但该函数仍会从中返回 TRUE
  • 看起来在 Windows 8 之前没有直接的方法来检测休眠。但我想你可以空闲循环并观察系统时间。如果时间突然向前跳跃,则您已成功休眠(并恢复!),如果在一分钟左右内没有发生这种情况,则请求可能失败。
  • 您还可以检查有问题的系统,当休眠失败时,Windows 是否将任何内容写入事件日志。如果是这样,您的应用程序可以监控相关条目的事件日志。
  • 谢谢各位。我使用 NULL 作为第二个参数,因为它自 Vista 以来就没有使用过。 @HarryJohnston 你将如何在 Windows 8 中做到这一点?您的系统时间观察方法也很酷。我唯一担心的是系统时间更改或夏令时调整的情况。那个怎么样?无论如何,这似乎是一个答案。要不要单独发,我标记一下?

标签: c++ windows winapi hibernation


【解决方案1】:

看起来没有直接的方法来检测休眠[更正:我错了。请参阅 Fowl 的回答。] 直到 Windows 8(请参阅 PowerRegisterSuspendResumeNotification)。但我想你可以空闲循环并观察系统时间。如果时间突然向前跳跃,则您已成功休眠(并恢复!),如果在一分钟左右内没有发生这种情况,则请求可能失败。我认为您可以使用GetTickCount64 函数,该函数对系统时间变化不敏感,但显然包含对睡眠时间的偏差。如果这不起作用,请使用GetSystemTimeAsFileTime,但也要注意WM_TIMECHANGE 消息。

您还可以检查相关系统,当休眠失败时,Windows 是否将任何内容写入事件日志。如果是这样,您的应用程序可以监视相关条目的事件日志。这将是一种更可靠的方法。

【讨论】:

  • 真的没有办法吗? .NET 有msdn.microsoft.com/en-us/library/…
  • 使用 WM_POWERBROADCAST 消息,根据msdn.microsoft.com/en-us/library/windows/desktop/…
  • @Fowl:您应该将其发布为答案。 (我也会编辑我的。)
  • @HarryJohnston:首先我在寻找一个原生 C++ 解决方案,而不是一个 .NET 解决方案。 .NET 事件只是底层内核事件的镜像副本,它作为 WM_POWERBROADCAST 消息广播到本机代码。所以那里没有什么新东西。所以回到我的问题——我正在寻找休眠/睡眠失败的时间,到目前为止,我无法在任一版本的 Windows 上找到了解它的方法。 SetSuspendState API 确实可以返回 false,但并非总是如此……我接受了您的回复,因为它提出了另一种方法……
  • 如果休眠失败,您肯定不会收到 PBT_APMRESUMESUSPEND 事件吗?
【解决方案2】:

注册 (RegisterPowerSettingNotification),然后监听 WM_POWERBROADCAST,然后查询事件日志以获取更多详细信息。

如果您想处理多个操作系统版本,会有些麻烦,但这是可行的。

【讨论】:

  • 谢谢,但是“查询事件日志以获取更多详细信息”对于 IT 技术人员来说是一个不错的电话支持建议,但在自动化代码中实现却是一个有争议的问题。 ..
  • 您可以从应用程序查询事件日志。在 MSDN 中搜索 OpenEventLog。
【解决方案3】:

嗯...也许我在这里错过了重点,但根据文档,如果失败,它应该返回 FALSE。在你的情况下它仍然返回 TRUE 吗?

【讨论】:

  • 看起来确实如此。在 Windows 中发生的情况是进程开始然后简单地退出,我再次看到桌面......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2013-01-02
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多