Подтвердить что ты не робот

Определение времени простоя с использованием python

Как определить, работает ли система в Windows с использованием Python (т.е. нет активности клавиатуры или мыши). Это уже задано до, но в модуле pywin32, похоже, нет GetLastInputInfo.

4b9b3361

Ответ 1

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(), чтобы получить время простоя в секундах.

Ответ 2

Кажется, что GetLastInputInfo теперь доступен в pywin32:

win32api.GetLastInputInfo()

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

Здесь с примером программы

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

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

Ответ 3

import win32api
def getIdleTime():
    return (win32api.GetTickCount() - win32api.GetLastInputInfo()) / 1000.0

Ответ 4

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

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

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

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

Ответ 5

@ForgeBird ответ довольно крутой и работает, но спешил, я не был уверен, как это работает, поэтому здесь немного пример теста. Поток запускается, ища последний простоя каждые 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()