请注意,这与我发现的其他问题(我确实搜索过)不同,例如:有没有什么办法可以在关闭笔记本电脑盖子时执行某些操作?
我使用了同样的技巧,在事件 #42(系统、内核电源、事件 42)上安排任务,但问题是,该任务 - 至少在我的情况下 - 实际上并没有运行前去睡觉。看来计划执行了它并同时去睡觉了。如果任务执行的时间更长,那么运气就不好了。
我有一个批处理文件,它执行以下操作:
@echo off
cd /d %~dp0
taskkill /t /im skype.exe
sleep 2
taskkill /t /f /im skype.exe
sleep 1
我的任务是不是在进入睡眠状态之前执行。机器立即进入睡眠状态,因为我可以看到 LED 熄灭,并且在不到 1 秒的时间内听到硬盘发出咔嗒声,而我希望它在进入睡眠状态之前保持 3 秒钟。
看来调度程序启动的任务并没有推迟睡眠事件——并且有正当的理由(如果你的任务挂起怎么办?)——但就我而言,这很令人沮丧!
有人知道如何让它按上述预期工作但由事件 42 触发吗?
干杯
笔记:我知道我可以创建一个批处理/程序/任务,首先终止 Skype,等待,然后发送睡眠事件,但我希望能够使用事件 42 来触发它。其他用户有时会在 Skype 以不同的帐户运行时登录到此计算机,他们使用开始菜单中的常规睡眠条目将其发送到睡眠状态,而不是自定义批处理/程序。
笔记2还尝试使用位于 Windows\System32 中的 taskkill 和 sleep 的完整路径。这会杀死 Skype.exe,然后等待 2 秒,然后强制杀死 Skype.exe,然后再等待 1 秒。这是由于 Skype for Win 7 x64 中的一个错误,该错误会导致 Skype 从睡眠状态唤醒后挂起。我不想等待微软修复这个非常古老、令人沮丧且被过度报告的错误,而是想实现自己的修复。
答案1
事件 42 发生得太晚(在流程结束时,没有时间做任何有用的事情),因为它旨在作为后续诊断的“文档”,而不是通知前事情发生了。(我不明白微软的版主怎么能建议它?)
不幸的是,我还没有看到解决您问题的有效方法,但我确信 Windows做提供事件前通知,尽管不在事件日志中。这意味着您必须创建/使用始终运行的后台应用程序(〜“守护进程”)来捕获此预待机通知,然后执行任何您想做的事情。
我不知道现有的应用程序可以做到这一点,我也不知道相关的 Windows API;但在提供更好的答案之前,以下是一些可能有助于您制定解决方案的起点:
- 以下 MSDN 页面似乎提供了有关通知本身的信息:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa373233
http://msdn.microsoft.com/en-us/library/ms703398.aspx#handling_sleep_transitions
http://msdn.microsoft.com/en-us/library/ms701723.aspx - 如果你不想深入研究 C++,那么启动电源监视器Tcl/Tk 的 TWAPI 扩展命令看起来很有前景(参见暂停事件)。
语言不是一个需要安装和配置的复杂产品,而是一个简单、功能强大的产品,可执行文件当与单个TWAPI 动态链接库,与 PowerShell 竞争(占用空间更小)(虽然 PowerShell 肯定也能解决这个问题,但我不知道相关的命令/包。)
更新:
没有办法“推迟睡眠事件”,因为微软已经停止了PBT_APMQUERYSUSPEND在 XP 和 Vista 中允许这样做。相反,现在说您无法阻止用户让计算机进入睡眠状态:
应用程序应该尊重用户在关闭笔记本电脑盖子或按下电源按钮时所期望的某种行为。
只有PBT_APMSUSPEND事件仍然存在,之后
系统允许应用程序大约两秒钟的时间来处理该通知。