在Windows 7中在睡眠前安排任务并推迟睡眠事件,直到任务运行


5

请注意,这与我发现的其他问题(我确实进行了搜索)不同,例如:关闭笔记本电脑的盒盖时,有什么方法可以执行某些操作?

我使用了与在事件#42(系统,内核电源,事件42)上安排任务的方法相同的技巧,但问题是,至少在我看来,该任务在入睡并未真正运行。时间表似乎执行了它并同时进入睡眠状态。如果任务需要更长的时间来执行,那么运气就不好了。

我有一个批处理文件,它可以:

@echo off
cd /d %~dp0
taskkill /t /im skype.exe
sleep 2
taskkill /t /f /im skype.exe
sleep 1

我的任务在入睡前执行。机器立即进入睡眠状态,因为我可以看到LED熄灭并听到HDD在不到1秒的时间内发出喀哒声,而我希望它保持3秒钟,然后再进入睡眠状态。

似乎由调度程序启动的任务没有推迟睡眠事件-且有正当的理由(如果您的任务挂起了怎么办?)-但就我而言,这真是令人不快!

任何人都知道一种使其如上预期但被事件42触发的方法吗?

干杯

注意:我知道我可以创建一个批处理/程序/任务,该批处理/程序/任务首先杀死Skype,等待,然后发送一个Sleep事件,但我希望能够使用事件42触发它。其他用户有时会在Skype处于在另一个帐户中运行,他们使用开始菜单中的常规“睡眠”条目(而不是自定义批处理/程序)将其发送到睡眠状态。

NOTE2还尝试使用Windows \ System32中的taskkill和sleep的完整路径。这将杀死Skype.exe,然后等待2秒,然后强行杀死Skype.exe,然后再等待1秒。这是由于Skype for Win 7 x64中的一个错误引起的,该错误从睡眠状态唤醒后挂起了Skype。我不想等待Microsoft修复这个非常古老且令人沮丧的应用程序,而是报告了如此多的错误,我想实施自己的修复程序。

Answers:


4

事件42发生得太晚了(在该过程结束时,没有时间做任何有用的事情),因为它旨在作为后续诊断的“文档”,而不是事发之前的通知。(我不知道MSFT主持人如何提出建议?)

不幸的是,我还没有找到解决您问题的有效解决方案,但是我确定Windows 确实提供了事前通知,尽管事件日志中没有。这意味着您必须创建/使用一个始终运行的后台应用程序(〜一个“守护程序”),该应用程序会捕获此待机前通知,然后执行您喜欢的任何事情。
我不知道现有的应用程序可以做到这一点,我也不知道相关的Windows API。但是在提供更好的答案之前,以下是一些可以帮助您制定解决方案的起点:

更新:

没有办法“推迟睡眠事件”,因为微软已经停止了允许在XP和Vista中使用的PBT_APMQUERYSUSPEND。相反,现在说您不能阻止用户使计算机进入睡眠状态:

应用程序应考虑到用户在关闭笔记本电脑的机盖或按下电源按钮时会期望某些行为。

之后仅保留PBT_APMSUSPEND事件

系统需要大约两秒钟的时间来使应用程序处理此通知。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.