2009-05-26 111 views
16

WindowsでPythonを使用してシステムがアイドル状態になっているかどうかを検出するにはどうすればよいですか? これは既にbeforeと尋ねられていますが、モジュールにはGetLastInputInfoと思われません。Pythonを使用してアイドル時間を検出する

+5

それはなぜあなたが再び求めている、前に頼まれたので?あなたは何が変わって別の答えが出ると思いますか? –

+1

多分、誰かがそれに答えることができる人がいますが、古い質問は年齢と曖昧さに埋もれています。誰かの古い質問にどうやって "バンプ"することができますか? –

+0

以前に尋ねられたとき、その答えはマウスクリックの検出に関するものでしたが、それはその質問に対する答えの近くにありませんでした! – Badri

答えて

2

実は、あなたはcytpesライブラリ経由GetLastInputInfoにアクセスすることができます。それは、システム全体にわたるが、唯一と呼ばれるセッションについてのアイドル情報を提供しないよう

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

これは、あなたがが望むものではないかもしれません関数。 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 
関連する問題