如何让Python计算Windows休眠期间的时间?

4
我有一个Python脚本,它执行一项特定任务,然后休眠4小时。该任务是关闭每4小时弹出的一个窗口。
while(True):
    if (is_window_open()):
        close_window()
        time.sleep(4*3600) #The timer is actually a little less than 4 hours
    time.sleep(1)

我的电脑连续运行时,脚本运作得很好。但在Windows休眠和唤醒后,它就会失败。我发现当Windows进入睡眠状态时,睡眠计时器不会运行,而是会从Windows进入睡眠状态时停止的地方继续计时。问题在于,当Windows从睡眠状态中被唤醒时,这个窗口弹出来了,我希望我的脚本可以自动关闭它。
例如:假设这个窗口在23:00弹出来,我的脚本关闭了窗口并进入了睡眠状态。现在在23:30,Windows进入了睡眠状态。睡眠计时器停止了30分钟。假设在06:00,我把Windows唤醒,应该被关闭的那个窗口出现了,但我的脚本计时器从30分钟开始,并且需要再过3.5小时才能关闭这个窗口。
一个我想到的解决方法是检查实际的睡眠时间和唤醒时间,然后比较这两个时间以确定是否已经过去了4小时。但这需要我的脚本知道Windows何时进入睡眠状态和何时唤醒,这可以通过使用Windows关机事件来实现,尽管我无法想出如何使用它。我看到了这个问题,但我无法弄清楚如何在我的情况下使用它,也不能在运行时使其工作。我添加了一个日志以记录关闭发生的时间,但该日志从未打印过。在我的情况下,Windows进入睡眠状态时,我需要侦听WM_POWERBROADCASTPBT_APMSUSPEND,但这似乎也无法正常工作。(我认为这可能是因为我的脚本在后台运行)
另一种可行的解决方法是将睡眠时间设置为1秒,这也可以解决问题,但我想知道是否有其他解决办法,可以保持计时器为4小时,并且仍然能让我的脚本正常工作。
有没有解决方案可以修复我的想法,在其中可以获取Windows睡眠时间和唤醒时间,或者其他可以使用的解决方案? 注意:我无法停止窗口每4小时弹出一次,因为我没有权限停止触发窗口弹出的PowerShell脚本。此外,我的Python脚本在启动电脑时自动启动,并包含4个线程,用于完成一些小任务。关闭窗口的脚本是其中之一。我的脚本使用Visual Basic脚本在后台运行。
Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "D:\scripts\script.bat" & Chr(34), 0 
Set WshShell = Nothing 

script.bat 只是启动了 Python 脚本。

编辑:我使用 pygetwindow 模块来检查窗口是否打开并关闭它。


你可以使用调度程序来代替运行无限循环。https://docs.python.org/3/library/sched.html - priyam bajpai
@priyambajpai 但我希望循环无限运行。假设我从不关闭我的电脑(最坏的情况,高度不可能),我想每4个小时继续检查。即使我使用调度程序进行操作,我仍然需要每4个小时运行它。您能详细说明如何删除while循环并仍然使用事件调度程序获得所需效果吗? - mtm
1个回答

0

不要让系统处理4小时的睡眠,你可以通过在一个while循环中每次只睡1秒钟来掌握睡眠的问题,直到当前时间达到预定的结束时间为止:

end_time = time.time() + 4 * 3600
while time.time() < end_time:
    time.sleep(1)

1
是的,我在我的问题中提到了一个类似的解决方案。在我的解决方案中,我不会睡眠4个小时,而是每一秒钟检查窗户是否打开,这将解决问题,即使在睡眠唤醒时也是如此。但我想避免一秒钟的睡眠,因此提出了这个问题。 - mtm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接