Windows、Linux、MacOSでPythonからディスプレイのアイドル時間を確認するにはどうすればよいですか?

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

質問

ユーザーが最後にキーを押すかマウスを動かしてからの時間を知りたい-私のアプリケーションだけでなく、「コンピュータ」全体でも。 (つまり、ディスプレイ)、彼らがまだコンピュータにいて、画面にポップアップする通知を観察できるかどうかを推測するため。

純粋に(Py)GTK +からこれを行いたいのですが、プラットフォーム固有の関数を呼び出すことができます。理想的には、すでにPythonからラップされた関数を呼び出したいのですが、それが不可能な場合は、自分が何を知っている限り、Cまたは ctypes コードを少し上回っていません実際に探しています。

Windowsでは、必要な機能は GetLastInputInfo 、しかしそれはpywin32でラップされていないようです。何か不足していると思います。

役に立ちましたか?

解決

Gajim は、Windows、OS X、およびGNU / Linux(およびその他の* nix)でこのように動作します:

  1. Pythonラッパーモジュール(また ctypes )で GetTickCount を使用するWindowsアイドル時間検出コードが含まれています;
  2. X11アイドル時間を取得するCtypesベースのモジュール XScreenSaverQueryInfo を使用、古いGajimバージョンではCモジュールでした);
  3. OS Xをアイドル状態にするためのCモジュール時間 HIDIdleTime システムプロパティを使用)。

これらのリンクは、かなり古い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

上記の例では、ctypesを介してgdkを使用して、X11固有にアクセスできるようにします。 Xscreensaver APIもctypes経由でアクセスする必要があります。

PyGIとイントロスペクションを使用するために移植するのは非常に簡単なはずです。

pyHook :

Pythonを使用したウィンドウでのマウスクリックの検出

ctypesを介してマウス位置を検出するために行った他のコードを次に示します。 http://monkut.webfactional.com/ blog / archive / 2008/10/2 / python-win-mouse-position

これを達成するためのもっとラウンドアラウンドな方法は、スクリーンキャプチャを介して、PILを使用して画像の変化を比較することです。

http:/ /www.wellho.net/forum/Programming-in-Python-and-Ruby/Python-Imaging-Library-PIL.html

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top