【发布时间】:2021-07-26 03:41:03
【问题描述】:
我有一个 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)
当我的 PC 连续运行时,该脚本运行良好,但在 Windows 进入睡眠状态并唤醒后它就失败了。我意识到,当 Windows 处于睡眠状态时,睡眠定时器不会运行,它会从 Windows 进入睡眠状态时停止的位置继续睡眠定时器。我面临的问题是,当 Windows 从睡眠中唤醒时,会弹出此窗口,我希望我的脚本自动关闭它。
例如:假设这个窗口在 2300 小时弹出,我的脚本关闭了窗口并进入睡眠状态。现在在 2330 时,Windows 进入睡眠状态。现在睡眠定时器在 30 分钟停止。假设在 0600 时,我将 Windows 从睡眠中唤醒。应该关闭的窗口出现了,但我的脚本计时器从 30 分钟开始,并且必须再完成 3.5 小时才能关闭此窗口。
我脑海中突然出现的一个解决方案是检查实际的睡眠时间和起床时间,并比较这两个时间以确定 4 小时是否已过。但这需要我的脚本知道 Windows 何时进入睡眠状态以及何时唤醒,我相信这可以使用 Windows 关闭事件 来实现,尽管我不知道如何使用它。我看到了这个question,但无法弄清楚如何在我的场景中使用它,也无法在我运行它时工作。我在关机发生时添加了一个日志,但该日志从未打印过。在我的 Windows 进入睡眠的场景中,我需要用PBT_APMSUSPEND 收听WM_POWERBROADCAST,但这似乎也不起作用。 (我相信这可能是因为我的脚本在后台运行)
另一个可行的解决方案是将睡眠时间设置为 1 秒,这也可以解决手头的问题,但我想知道是否有替代解决方案,我可以将计时器保持在 4 小时并且仍然可以能够使我的脚本工作。
有没有一个解决方案,我可以解决我可以获得 Windows 睡眠时间和唤醒时间的想法,或者我可以使用其他一些解决方案?
注意:我无法阻止窗口每 4 小时弹出一次,因为我没有权限停止使窗口每 4 小时弹出一次的 Powershell 脚本。此外,当我启动 PC 时,我的 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 模块。
【问题讨论】:
-
您可以使用 schedular 而不是运行无限循环。 docs.python.org/3/library/sched.html
-
@priyambajpai 但我希望循环无限运行。假设我从未关闭我的电脑(最坏的情况,极不可能),我想继续每 4 小时检查一次。即使我使用调度程序执行此操作,我仍然必须每 4 小时运行一次。您能否详细说明如何删除 while 循环并仍然使用事件调度程序获得所需的效果?
标签: python windows multithreading