Как определить, работает ли система в Windows с использованием Python (т.е. нет активности клавиатуры или мыши).
Это уже задано до, но в модуле pywin32
, похоже, нет GetLastInputInfo
.
Определение времени простоя с использованием python
Ответ 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()