كيف يمكنني تحديد عرض الوقت الضائع من الثعبان في ويندوز, لينكس, ماك?
سؤال
أود أن أعرف كم من الوقت مر منذ مستخدم آخر ضرب الرئيسية أو تحرك الماوس - ليس فقط في التطبيق ، ولكن في موضوع "الكمبيوتر" (أيعرض) ، من أجل تخمين ما إذا كان أنهم ما زالوا في الكمبيوتر قادرة على مراقبة الإخطارات التي يطفو على السطح على الشاشة.
أود أن تفعل هذا بحتة من (Py)GTK+, ولكن أنا قابلة الدعوة منصة-وظائف محددة.ومن الناحية المثالية كنت ترغب في استدعاء الوظائف التي سبق ملفوفة من بيثون ، ولكن إذا كان هذا غير ممكن, أنا لا تتجاوز قليلا من ج أو ctypes
رمز طالما أنا أعرف ما أنا فعلا تبحث عن.
على ويندوز أعتقد أن وظيفة أريده هو GetLastInputInfo
, ولكن لا يبدو أن تكون ملفوفة pywin32;أتمنى أن أنا في عداد المفقودين شيء.
المحلول
Gajim هل هذه الطريقة على ويندوز ، OS X و جنو/لينكس (وغيرها *nixes):
- بيثون المجمع وحدة (ويشمل أيضا نظام ويندوز الوقت الضائع الكشف عن التعليمات البرمجية باستخدام
GetTickCount
معctypes
); - Ctypes على أساس وحدة للحصول على X11 وقت الخمول (باستخدام
XScreenSaverQueryInfo
, كان ج وحدة في العمر Gajim الإصدارات); - ج وحدة للحصول على OS X وقت الخمول (باستخدام
HIDIdleTime
نظام الملكية).
هذه الروابط تماما مؤرخة 0.12 الإصدار ، لذلك قد ترغب في التحقق من مصدر في الوقت الراهن من أجل إدخال مزيد من التحسينات والتغييرات.
نصائح أخرى
إذا كنت تستخدم باي جتك وX11 على لينكس، يمكنك أن تفعل شيئا من هذا القبيل، والتي تقوم على ما تقوم بجين:
import ctypes
import ctypes.util
import platform
class XScreenSaverInfo(ctypes.Structure):
_fields_ = [('window', ctypes.c_long),
('state', ctypes.c_int),
('kind', ctypes.c_int),
('til_or_since', ctypes.c_ulong),
('idle', ctypes.c_ulong),
('eventMask', ctypes.c_ulong)]
class IdleXScreenSaver(object):
def __init__(self):
self.xss = self._get_library('Xss')
self.gdk = self._get_library('gdk-x11-2.0')
self.gdk.gdk_display_get_default.restype = ctypes.c_void_p
# GDK_DISPLAY_XDISPLAY expands to gdk_x11_display_get_xdisplay
self.gdk.gdk_x11_display_get_xdisplay.restype = ctypes.c_void_p
self.gdk.gdk_x11_display_get_xdisplay.argtypes = [ctypes.c_void_p]
# GDK_ROOT_WINDOW expands to gdk_x11_get_default_root_xwindow
self.gdk.gdk_x11_get_default_root_xwindow.restype = ctypes.c_void_p
self.xss.XScreenSaverAllocInfo.restype = ctypes.POINTER(XScreenSaverInfo)
self.xss.XScreenSaverQueryExtension.restype = ctypes.c_int
self.xss.XScreenSaverQueryExtension.argtypes = [ctypes.c_void_p,
ctypes.POINTER(ctypes.c_int),
ctypes.POINTER(ctypes.c_int)]
self.xss.XScreenSaverQueryInfo.restype = ctypes.c_int
self.xss.XScreenSaverQueryInfo.argtypes = [ctypes.c_void_p,
ctypes.c_void_p,
ctypes.POINTER(XScreenSaverInfo)]
# gtk_init() must have been called for this to work
import gtk
gtk # pyflakes
# has_extension = XScreenSaverQueryExtension(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()),
# &event_base, &error_base);
event_base = ctypes.c_int()
error_base = ctypes.c_int()
gtk_display = self.gdk.gdk_display_get_default()
self.dpy = self.gdk.gdk_x11_display_get_xdisplay(gtk_display)
available = self.xss.XScreenSaverQueryExtension(self.dpy,
ctypes.byref(event_base),
ctypes.byref(error_base))
if available == 1:
self.xss_info = self.xss.XScreenSaverAllocInfo()
else:
self.xss_info = None
def _get_library(self, libname):
path = ctypes.util.find_library(libname)
if not path:
raise ImportError('Could not find library "%s"' % (libname, ))
lib = ctypes.cdll.LoadLibrary(path)
assert lib
return lib
def get_idle(self):
if not self.xss_info:
return 0
# XScreenSaverQueryInfo(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()),
# GDK_ROOT_WINDOW(), mit_info);
drawable = self.gdk.gdk_x11_get_default_root_xwindow()
self.xss.XScreenSaverQueryInfo(self.dpy, drawable, self.xss_info)
# return (mit_info->idle) / 1000;
return self.xss_info.contents.idle / 1000
والمثال أعلاه يستخدم غدك عبر ctypes لتكون قادرة على الوصول إلى X11 محددة. تحتاج Xscreensaver واجهات برمجة التطبيقات أيضا يمكن الوصول إليها عبر ctypes.
ويجب أن يكون من السهل جدا لميناء لاستخدام PyGI والتأمل.
وحصلت على الجواب فيما يتعلق نقرات الماوس مما يشير إلى استخدام pyHook أ >:
كشف نقرات الماوس في ويندوز باستخدام الثعبان
وفيما يلي بعض التعليمات البرمجية الأخرى فعلت للكشف عن الماوس موقف عبر ctypes: http://monkut.webfactional.com/ بلوق / أرشيف / 2008/10/2 / الثعبان للجانبين الفأر موقف
وهناك طريقة أكثر مستديرة حول لإنجاز هذا من شأنه أن يكون عن طريق القبض على الشاشة ويقارن أي تغيير في الصور باستخدام PIL.
HTTP: / /www.wellho.net/forum/Programming-in-Python-and-Ruby/Python-Imaging-Library-PIL.html