有没有办法检测计算机是否退出睡眠模式?

问题描述 投票:0回答:3

问题

我想用Python编写一个程序,其中的脚本在检测到它已退出睡眠模式时执行。 例如,我正在使用笔记本电脑。当我打开笔记本电脑时,脚本应该运行。有没有办法检测到这一点然后运行脚本?有没有监听此类事件的模块?


目标

最终目标是一种安全系统,如果用户的计算机被使用,则会向用户的手机发送警报。我对警报发送部分有一个想法,我只是不知道如何首先触发该程序。

基本格式应如下所示:
if computer_active == True:
    alert.send("Computer accessed")
    

显然它看起来会比这更复杂,但这是总体思路。

我在 MacOSX v10.15.7 上运行 Python3.10.0

非常感谢任何帮助!
python python-3.x system
3个回答
1
投票

一个也许总比没有好的解决方案。它很hacky,它需要始终运行,它不是事件驱动的;但是:它很短,可配置且便携:-)

'''
Idea: write every some seconds to a file and check regularly.
It is assumed that if the time delta is too big,
the computer just woke from sleep.
'''

import time

TSFILE="/tmp/lastts"
CHECK_INTERVAL=15
CHECK_DELTA = 7

def wake_up_from_sleep():
    print("Do something")

def main():
    while True:
        curtime = time.time()
        with open(TSFILE, "w") as fd:
            fd.write("%d" % curtime)
        time.sleep(CHECK_INTERVAL)
        with open(TSFILE, "r") as fd:
            old_ts = float(fd.read())
        curtime = time.time()
        if old_ts + CHECK_DELTA < curtime:
            wake_up_from_sleep()

if __name__ == '__main__':
    main()

0
投票

问题很老了,但是因为我在寻找同样的东西,但我在网上没有找到任何东西......

import win32com.client

colMonitoredEvents = win32com.client.Dispatch("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecNotificationQuery("Select * from Win32_PowerManagementEvent")

while True:
    objLatestEvent = colMonitoredEvents.NextEvent()
    if objLatestEvent.EventType == 7:
        pass #do your stuff here

基于事件,以低CPU使用率无限期运行,并在事件ID为7时执行操作;事件 4 应在进入睡眠状态时捕获。请注意,对于事件 4,操作应该非常快,否则很可能在 PC 进入睡眠状态之前无法完成。


0
投票

systemd 可以选择每次唤醒后执行一次(python)脚本。因此,您可以创建一个脚本,该脚本知道每次运行时都发生了唤醒,并且您可以从那里获取它。如果您需要通知必须始终运行的脚本,请使用进程间通信,特别是事件。请参阅 multiprocessing,特别是 SyncManager(尽管我发现 BaseManager 和传递独立的 Event 对象更容易)。

© www.soinside.com 2019 - 2024. All rights reserved.