JawsIk
@JawsIk
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)

Как отследить, когда монитор выключился?

Всем привет, ребят, кто знает есть ли возможность отследить, когда монитор выключен?

Пишу для себя некий аналог контроля за тем, что дети делают на компьютере. Уже реализовал, какие программы, когда запускаются и когда выключаются. Уже реализовал, когда и сколько каким окном (какой программой) пользовались.

Научился отслеживать, когда запускается "экранная заставка" (screensaver) и замерять, сколько компьютер стоял в режиме этой заставки.

Но столкнулся с тем, что через 15 минут простоя компьютер выключает монитор и (как оказалось) в момент выключения монитора, он выключает и screensaver. При этом (в фоне с выключенным монитором) фокус передаётся на последнее используемое окно (браузер там или PyCharm) и статистика начинает считать, что мол мы пользуемся PyCharm-ом, а по факту монитор выключен и никто ничем не пользуется.

Вопрос, как отследить этот момент, т.е. проверять, мол если заставка выключилась, то проверить, "а может быть и монитор выключен". Вот этот момент я отследить не могу.

p.s. почти всё реализовал через pywin32

p.s.2. Вот например (сокращённая, но рабочая функция для отслеживания screensaver)
import datetime
from time import sleep
from win32gui import GetWindowText, GetForegroundWindow
from win32com.client import GetObject

_wmi = GetObject('winmgmts:')
pause_ = .5
just_ = 25

def pause_screensaver():
    is_screensaver = False
    while len(_wmi.ExecQuery("Select * from win32_process Where Name LIKE '%.scr'")) > 0:
        is_screensaver = True
        sleep(pause_)
    return is_screensaver

...
            start_screen_time = datetime.datetime.today()
            if pause_screensaver():
                end_screen_time = datetime.datetime.today()
                diff_ = str(end_screen_time - start_screen_time).split('.')[0]
                print("-- screensaver --".ljust(just_ - 5), diff_)
...


И вот когда срабатывает функция "pause_screensaver", она крутиться бесконечно, пока включена заставка, а потом бац и монитор выключается, при этом происходит выход из цикла и далее программа снова прощупывает активное окно (через GetForegroundWindow()) и (обнаружив его) начинает думать, что мы снова пользуемся этим окном, хотя по факту монитор выключен.
  • Вопрос задан
  • 184 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы