كيف يمكنني تحديد عرض الوقت الضائع من الثعبان في ويندوز, لينكس, ماك?

StackOverflow https://stackoverflow.com/questions/217157

سؤال

أود أن أعرف كم من الوقت مر منذ مستخدم آخر ضرب الرئيسية أو تحرك الماوس - ليس فقط في التطبيق ، ولكن في موضوع "الكمبيوتر" (أيعرض) ، من أجل تخمين ما إذا كان أنهم ما زالوا في الكمبيوتر قادرة على مراقبة الإخطارات التي يطفو على السطح على الشاشة.

أود أن تفعل هذا بحتة من (Py)GTK+, ولكن أنا قابلة الدعوة منصة-وظائف محددة.ومن الناحية المثالية كنت ترغب في استدعاء الوظائف التي سبق ملفوفة من بيثون ، ولكن إذا كان هذا غير ممكن, أنا لا تتجاوز قليلا من ج أو ctypes رمز طالما أنا أعرف ما أنا فعلا تبحث عن.

على ويندوز أعتقد أن وظيفة أريده هو GetLastInputInfo, ولكن لا يبدو أن تكون ملفوفة pywin32;أتمنى أن أنا في عداد المفقودين شيء.

هل كانت مفيدة؟

المحلول

Gajim هل هذه الطريقة على ويندوز ، OS X و جنو/لينكس (وغيرها *nixes):

  1. بيثون المجمع وحدة (ويشمل أيضا نظام ويندوز الوقت الضائع الكشف عن التعليمات البرمجية باستخدام GetTickCount مع ctypes);
  2. Ctypes على أساس وحدة للحصول على X11 وقت الخمول (باستخدام XScreenSaverQueryInfo, كان ج وحدة في العمر Gajim الإصدارات);
  3. ج وحدة للحصول على 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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top