我想知道自用户上次按键或移动鼠标以来已经有多长时间了 - 不仅仅是在我的应用程序中,而是在整个“计算机”上。 (即显示),以便猜测它们是否仍在计算机上并能够观察屏幕上弹出的通知。

我想纯粹从(Py)GTK +这样做,但我可以调用特定于平台的函数。理想情况下,我想调用已经包含在Python中的函数,但如果这不可能,那么我不会超过一点C或 ctypes 代码,只要我知道我是什么我真的在寻找。

在Windows上我认为我想要的功能是 GetLastInputInfo ,但似乎并没有被pywin32包裹;我希望我错过了什么。

有帮助吗?

解决方案

Gajim 在Windows,OS X和GNU / Linux(以及其他* nixes)上采用这种方式:

  1. Python包装模块(也是包括Windows空闲时间检测代码,使用 GetTickCount ctypes );
  2. 基于Ctypes的模块获取X11空闲时间(使用 XScreenSaverQueryInfo ,是旧Gajim版本中的C模块);
  3. C模块让OS X空闲时间(使用 HIDIdleTime 系统属性)。
  4. 这些链接的日期为0.12版本,因此您可能需要检查当前来源以获得可能的进一步改进和更改。

其他提示

如果你在Linux上使用PyGTK和X11,你可以做这样的事情,这是基于Pidgin的作用:

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

上面的例子使用gdk via ctypes来访问特定的X11。 Xscreensaver API也需要通过ctypes访问。

将它移植到使用PyGI和内省时应该很容易。

我得到了关于鼠标点击建议使用 pyHook :

使用python检测Windows中的鼠标点击次数

这是我通过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