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

C# 检查计算机从休眠状态恢复的原因,c#,windows,windows-8.1,C#,Windows,Windows 8.1,我正在创建一个应用程序,将计算机置于休眠状态几个小时甚至一周(使用WaitableTimer和WaitForSingleObject) 有三个原因可以解释为什么电脑会被唤醒 等待计时器已过期,计算机按计划恢复 用户按下电源按钮可恢复计算机 计算机意外地打开了 前两个原因是完全可以接受的,它们是系统设计的目的。第三个原因当然不是那么好 我希望能够区分这三个打开的原因。有没有办法做到这一点?在第一个场景中,WaitForSingleObject方法应该返回WAIT\u OBJECT\u 0。如果不是

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

有三个原因可以解释为什么电脑会被唤醒

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

    我希望能够区分这三个打开的原因。有没有办法做到这一点?在第一个场景中,
    WaitForSingleObject
    方法应该返回
    WAIT\u OBJECT\u 0
    。如果不是这样的话,可能是场景2或场景3,但我不确定如何区分这两种情况。是否有API检查从待机状态恢复的原因

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


    (如果此软件设计的计算机是surface 3 pro,安装了附带(并更新)的Windows 8.1操作系统,则有任何帮助)

    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);
    
    如果命令(您的命令和此命令)都没有显示任何内容,则大多数可能的原因都已消除

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


    4/另一个安全性:确保BIOS设置中的任何设备都不允许唤醒电脑,只要它是可配置的。

    按照中的说明(特别是查看上次使用powercfg-lastwake唤醒的设备)后,我发现(在中)提到:

    Windows 10有一个新的“功能”,可以唤醒计算机做什么 它们称为“重要唤醒计时器”,您需要禁用它 如果您的计算机一直处于唤醒状态。进入权力选择 就像我们上面展示的,然后找到睡眠->允许唤醒计时器-> 插入并将设置从仅重要唤醒计时器更改为 禁用

    (强调矿山)


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

    我不确定这是否与按下电源按钮相同,但按下键盘上的键也会唤醒计算机(可能还有鼠标点击,但我不是100%确定)。只是澄清一下,你问的是从休眠状态唤醒(S4)州?因此,并非来自ACPI睡眠(S3)或连接的待机状态。对吗?我认为这是不可能的。我看不到任何ACPI规范()提供了有关在休眠事件后提供给操作系统的特定消息的详细信息,例如复活的原因。如果您不拥有/控制计算机上的所有软件(听起来好像没有),则不会“禁止其他设备/软件唤醒计算机”与陈雷蒙的思维实验发生冲突?当电脑“意外开启”时,事件日志是否显示任何原因?您是否已禁用任何计划任务?建议“当系统自动唤醒时,它会向所有应用程序广播PBT_APMRESUMEAUTOMATIC事件”——这有用吗?这是一个很好的答案。事件日志准确地向我提供了所需的信息,并且
    powercfg-waketimers
    将我指向了另一个罪犯(windows计划将计算机唤醒以进行维护,但是删除此waketimer似乎并不简单:)+151 ;)骗子,不管我是手动打开的还是唤醒计时器,唤醒源总是“未知”的。。。非常恼人的是Windows没有填写此字段。奇怪的是,在我的机器上,此字段几乎总是设置为:“设备-Microsoft鼠标和键盘检测驱动程序(USB)”、“电源按钮”、“设备-USB根集线器”,“计时器-Windows将执行请求唤醒计算机的“NT TASK\Microsoft\Windows\TaskScheduler\Regular Maintenance”计划任务”…我确实有一些“未知”“条目,我不知道它们与什么有关。要摆脱Windows维护计时器,只需转到“操作中心”/“维护”/“更改维护设置”,然后取消选中“允许维护以唤醒我的计算机”。通过谷歌搜索后,当设备唤醒计算机时,这些条目似乎已正确设置,但情况并非如此。”。。没有线索:)。唤醒计时器不是Windows10的新功能(不知道ThinkGeek是基于什么提出的)。他们已经存在了一段时间:)。不幸的是,我需要唤醒计时器自己唤醒电脑时,我想它。最后,计划维护任务定期重新启用,即使在手动禁用之后也是如此。这导致我的电脑开启了不必要的功能。我想这意味着“重要的唤醒计时器”的优先级(选项)是新的;您是如何发现计划维护任务正在自行重新启用的?您是如何“修复”的?
    powercfg -waketimers