2009-05-26 19 views
16

¿Cómo puedo detectar si el sistema está inactivo en Windows usando Python (es decir, sin actividad de teclado o mouse)? Esto ya se ha pedido before, pero no parece haber un GetLastInputInfo en el módulo pywin32.detectando el tiempo de inactividad usando python

+5

Desde que se preguntó antes, ¿por qué lo preguntas de nuevo? ¿Qué crees que ha cambiado que dará una respuesta diferente? –

+1

Quizás haya alguien alrededor que pueda responderlo, pero la vieja pregunta está oculta por la edad y la oscuridad. ¿Cómo puedes "superar" la vieja pregunta de otra persona? –

+0

cuando se le preguntó anteriormente, la respuesta fue sobre la detección de clics del mouse, que no estaba ni remotamente a la respuesta a esa pregunta. – Badri

Respuesta

2

En realidad, puede acceder a GetLastInputInfo a través de la cytpes biblioteca:

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

Esto podría no ser lo que quiere, sin embargo, ya que no proporciona información de estado libre en todo el sistema, pero sólo alrededor de la sesión que llama la función. See MSDN docs.

Como alternativa, podría check if the system is locked, o si se ha iniciado el protector de pantalla.

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 

Llame al get_idle_duration() para obtener tiempo de inactividad en segundos.

+0

funciona como un encanto – Claudiu

+0

Otra biblioteca podría establecer 'argtypes',' restype', o 'errcheck' en' windll.user32.GetLastInputInfo' de una manera incompatible, por lo que debe usar su propia instancia 'WinDLL', p. 'user32 = WinDLL ('user32', use_last_error = True)'. – eryksun

6

parece que GetLastInputInfo ya está disponible en pywin32:

win32api.GetLastInputInfo() 

hace el truco y devuelve el paso del temporizador de la última acción de entrada del usuario.

Aquí con un programa de ejemplo

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

Si se presiona una tecla/mueve el ratón mientras el guión duerme, los cambios de número de impresos.

1

@ La respuesta de FogleBird es muy buena y funciona, pero no estaba seguro de cómo funciona, así que un pequeño ejemplo de prueba aquí. Se está iniciando un hilo, buscando el último tiempo de inactividad cada 10 segundos. Si se realiza algún movimiento dentro de esta ventana de tiempo, se imprimirá.

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 
Cuestiones relacionadas