2009-05-26 4 views
16

Comment détecter si le système est inactif sur Windows en utilisant Python (c'est-à-dire sans activité de clavier ou de souris). Cela a déjà été demandé before, mais il ne semble pas y avoir un GetLastInputInfo dans le module pywin32.Détection de l'inactivité à l'aide de Python

+5

Comme il a été demandé avant, pourquoi demandez-vous encore? Que pensez-vous a changé qui donnera une réponse différente? –

+1

Peut-être qu'il y a quelqu'un à l'heure actuelle qui peut y répondre, mais la vieille question est enterrée dans l'âge et l'obscurité. Comment pouvez-vous "bosse" la vieille question de quelqu'un d'autre? –

+0

quand il a été précédemment demandé, la réponse était sur la détection des clics de souris, qui était loin d'être une réponse à cette question! – Badri

Répondre

2

En fait, vous pouvez accéder GetLastInputInfo via la bibliothèque cytpes:

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

Cela pourrait ne pas être ce que vous voulez bien, car il ne fournit pas d'informations au ralenti dans l'ensemble du système, mais seulement sur la session qui a appelé la fonction. See MSDN docs.

Vous pouvez également utiliser check if the system is locked ou si l'économiseur d'écran a été démarré.

18
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 

Appelez get_idle_duration() pour obtenir le temps d'inactivité en secondes.

+0

fonctionne comme un charme – Claudiu

+0

Une autre bibliothèque peut définir 'argtypes',' restype', ou 'errcheck' sur' windll.user32.GetLastInputInfo' d'une manière incompatible, vous devriez donc utiliser votre propre instance 'WinDLL', par ex. 'user32 = WinDLL ('user32', use_last_error = Vrai)'. – eryksun

6

On dirait GetLastInputInfo est maintenant disponible en pywin32:

win32api.GetLastInputInfo() 

le tour est joué et retourne la tique de la minuterie de la dernière action d'entrée utilisateur.

Voici un exemple programme

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

Si l'on appuie sur une touche/déplace la souris alors que le script dort, les changements de numéro imprimé.

1

@ La réponse de FogleBird est plutôt cool et fonctionne, mais pressé je n'étais pas sûr de la façon dont cela fonctionne, donc un petit exemple de test ici. Un thread démarre, à la recherche du dernier temps d'inactivité toutes les 10 secondes. Si un mouvement est effectué dans cette fenêtre de temps, il sera imprimé.

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() 
3
import win32api 
def getIdleTime(): 
    return (win32api.GetTickCount() - win32api.GetLastInputInfo())/1000.0 
Questions connexes