检查计算机从休眠状态恢复的原因

时间:2015-01-23 09:41:25

标签: c# windows windows-8.1

我正在创建一个应用程序,使计算机处于休眠状态几个小时甚至整整一周(使用WaitableTimer和WaitForSingleObject)。

计算机可以唤醒的原因有三个

  1. 等待计时器已过期,计算机按计划恢复。
  2. 用户按下恢复计算机的电源按钮。
  3. 计算机意外打开。
  4. 前两个原因是完全可以接受的,它们是系统的设计目标。第三个原因当然不是那么好。

    我希望能够区分开启这三个原因。有没有办法做到这一点?在这看来,在第一种情况下,WaitForSingleObject方法应该返回WAIT_OBJECT_0 (source)。如果不是这种情况,那么它是情景2或3,但我不确定如何区分这两者。是否有API来检查从待机状态恢复的原因?

    另一个(更好的)选项是禁止其他设备/软件唤醒计算机(例如,消除方案3)。我不允许在运行powercfg -devicequery -wake_armed时看到的所有设备的唤醒功能(当我运行命令时它现在返回NONE)。是否有类似的方法可以查看已安排计算机唤醒的所有(活动)软件?

    (如果对该软件设计的计算机有任何帮助,那么表面3 pro,安装了包含(和更新的)Windows 8.1操作系统)

2 个答案:

答案 0 :(得分:5)

1 /您可以查询Windows事件日志以查看导致计算机唤醒的原因:

  var log = new EventLog("System");
  var wakeUpEntry = (from entry in log.Entries.Cast<EventLogEntry>()
    where entry.Source == "Microsoft-Windows-Power-Troubleshooter"
          && entry.InstanceId == 1
    orderby entry.TimeWritten descending
    select entry).First();

  Console.WriteLine("{0}", wakeUpEntry.Message);

该消息有一个&#34;唤醒源&#34;输入(&#34; 4USB Root Hub&#34;例如),如果你真的想以编程方式进行解析,你可以解析。

2 /您可以使用以下命令检查是否有任何Windows或外部程序在系统上设置了唤醒定时器:

powercfg -waketimers

如果两个命令(你的或这个命令)都没有显示任何内容,那么大多数可能的原因都已被消除。

3 /您甚至可以在本机上完全禁用唤醒定时器。在Windows 电源选项计划设置高级计划设置中,在睡眠下禁用允许唤醒计时器 部分。我不确定Windows预定维护是否会受此影响,但您也可以将其关闭。

4 /另一种安全措施:确保BIOS设置中的任何设备都无法在可配置的情况下唤醒PC。

答案 1 :(得分:0)

按照this article中的说明(特别是看到最后一次用powercfg -lastwake唤醒了什么内容)后,我发现(this linked article)提到:

  

Windows 10有一个新的“功能”可以唤醒计算机   他们称“重要唤醒计时器”,你会想要禁用它   如果你的电脑一直在醒来。进入电源选项   就像我们上面显示的那样,然后找到Sleep - &gt;允许唤醒定时器 - &gt;   插入并将重要唤醒定时器的设置更改为   禁用。

(强调我的)

很确定这是将计算机从休眠状态唤醒的罪魁祸首,但尚未确认。