обнаружение простоя с помощью Python - PullRequest
21 голосов
/ 26 мая 2009

Как я могу определить, простаивает ли система в Windows с помощью Python (т. Е. Без действий клавиатуры или мыши). Об этом уже спрашивали до , но, похоже, GetLastInputInfo в модуле pywin32.

Ответы [ 5 ]

23 голосов
/ 26 мая 2009
from ctypes import Structure, windll, c_uint, sizeof, byref

class LASTINPUTINFO(Structure):
    _fields_ = [
        ('cbSize', c_uint),
        ('dwTime', c_uint),
    ]

def get_idle_duration():
    lastInputInfo = LASTINPUTINFO()
    lastInputInfo.cbSize = sizeof(lastInputInfo)
    windll.user32.GetLastInputInfo(byref(lastInputInfo))
    millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
    return millis / 1000.0

Позвоните get_idle_duration(), чтобы получить время простоя в секундах.

7 голосов
/ 14 августа 2010

Похоже, GetLastInputInfo теперь доступен в pywin32:

win32api.GetLastInputInfo()

выполняет трюк и возвращает тик таймера из последнего действия пользовательского ввода.

Вот пример программы

import time
import win32api
for i in range(10):
   print(win32api.GetLastInputInfo())
   time.sleep(1)

Если человек нажимает клавишу / перемещает мышь во время сна сценария, напечатанное число изменяется.

5 голосов
/ 17 ноября 2015
import win32api
def getIdleTime():
    return (win32api.GetTickCount() - win32api.GetLastInputInfo()) / 1000.0
2 голосов
/ 26 мая 2009

На самом деле, вы можете получить доступ к GetLastInputInfo через библиотеку cytpes:

import ctypes
GetLastInputInfo = ctypes.windll.User32.GetLastInputInfo  # callable function pointer

Это может быть не то, что вам нужно, поскольку оно не предоставляет информацию о простое по всей системе, а только о сеансе, который вызвал функцию. См. Документы MSDN.

В качестве альтернативы, вы можете проверить, заблокирована ли система или запущена заставка.

1 голос
/ 19 апреля 2015

@ Ответ FogleBird довольно крутой и работает, но я торопился, я не был уверен, как это работает, поэтому небольшой тестовый пример здесь. Поток запускается, ищет последний простой каждые 10 секунд. Если какое-либо движение будет сделано в течение этого временного окна, оно будет распечатано.

from ctypes import Structure, windll, c_uint, sizeof, byref
import threading

//Print out every n seconds the idle time, when moving mouse, this should be < 10
def printit():
  threading.Timer(10.0, printit).start()
  print get_idle_duration()



class LASTINPUTINFO(Structure):
    _fields_ = [
        ('cbSize', c_uint),
        ('dwTime', c_uint),
    ]

def get_idle_duration():
    lastInputInfo = LASTINPUTINFO()
    lastInputInfo.cbSize = sizeof(lastInputInfo)
    windll.user32.GetLastInputInfo(byref(lastInputInfo))
    millis = windll.kernel32.GetTickCount() - lastInputInfo.dwTime
    return millis / 1000.0

printit()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...