2009-05-26 4 views
16

का उपयोग कर निष्क्रिय समय का पता लगाने के लिए मैं कैसे पता लगा सकता हूं कि सिस्टम पाइथन (यानी कोई कीबोर्ड या माउस गतिविधि) का उपयोग कर विंडोज पर निष्क्रिय है या नहीं। यह पहले से ही before से पूछा गया है, लेकिन pywin32 मॉड्यूल में GetLastInputInfo प्रतीत नहीं होता है।पाइथन

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

यह नहीं हो सकता है कि तुम क्या हालांकि चाहते हैं, यह पूरी प्रणाली भर में निष्क्रिय जानकारी प्रदान नहीं करता है, लेकिन केवल सत्र कि कहा जाता है के बारे में:

+5

के बाद से यह पहले पूछा गया था, तुम क्यों फिर से पूछ रहे हैं? आपको क्या लगता है कि एक अलग जवाब मिलेगा? –

+1

शायद आसपास कोई ऐसा व्यक्ति है जो इसका उत्तर दे सकता है, लेकिन पुराना सवाल उम्र और अस्पष्टता में दफनाया गया है। आप किसी और के पुराने प्रश्न को "टक्कर" कैसे दे सकते हैं? –

+0

जब इसे पहले पूछा गया था, तो उत्तर माउस क्लिक का पता लगाने के बारे में था, जो कि उस प्रश्न के उत्तर के पास कहीं भी नहीं था! – Badri

उत्तर

2

असल में, आप cytpes पुस्तकालय के माध्यम से GetLastInputInfo उपयोग कर सकते हैं कार्यक्रम। See MSDN docs.

वैकल्पिक रूप से, आप check if the system is locked, या स्क्रीन-सेवर शुरू कर दिया गया है।

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 

सेकंड में निष्क्रिय समय प्राप्त करने के लिए get_idle_duration() पर कॉल करें।

+0

एक आकर्षण की तरह काम करता है – Claudiu

+0

एक और लाइब्रेरी एक 'असंगत तरीके से 'windll.user32.GetLastInputInfo' पर' argtypes', 'restype', या' errcheck' सेट कर सकती है, इसलिए आपको अपने स्वयं के 'WinDLL' उदाहरण का उपयोग करना चाहिए, उदा। 'user32 = WinDLL ('user32', use_last_error = True)'। – eryksun

6

लगता GetLastInputInfo की तरह अब pywin32 में उपलब्ध है:

win32api.GetLastInputInfo() 

काम कर देता है और पिछले उपयोगकर्ता इनपुट कार्रवाई से घड़ी टिक देता है। जबकि स्क्रिप्ट सोता

एक उदाहरण कार्यक्रम

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

एक एक चाबी प्रेस तो साथ यहाँ/माउस ले जाता है, मुद्रित संख्या बदल जाता है।

1

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