Windows, Linux 및 MacOS의 Python에서 디스플레이 유휴 시간을 어떻게 결정하려면 어떻게해야합니까?

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

문제

사용자가 마지막으로 키를 쳤거나 마우스를 옮겼는지가 얼마나 오래 걸렸는지 알고 싶습니다. 내 응용 프로그램뿐만 아니라 전체 "컴퓨터"(즉, 디스플레이)에서 그들이 여전히 컴퓨터 및 화면에 나타나는 알림을 관찰 할 수 있습니다.

(PY) GTK+에서 순전히이 작업을 수행하고 싶지만 플랫폼 별 기능을 호출 할 수 있습니다. 이상적으로는 이미 파이썬에서 래핑 한 함수를 호출하고 싶지만 불가능하다면 약간의 C 이상이 아닙니다. ctypes 내가 실제로 찾고있는 것을 아는 한 코드.

창에서 내가 원하는 기능은 생각합니다 GetLastInputInfo, 그러나 그것은 pywin32에 의해 포장되지 않은 것 같습니다. 뭔가 빠졌 으면 좋겠어요.

도움이 되었습니까?

해결책

Gajim Windows, OS X 및 GNU/Linux (및 기타 *닉스)에서 이런 식으로 수행합니까 :

  1. 파이썬 래퍼 모듈 (또한 Windows 유휴 시간 감지 코드, 사용 GetTickCount ~와 함께 ctypes);
  2. x11 유휴 시간을 얻는 CTypes 기반 모듈 (사용 XScreenSaverQueryInfo, 오래된 Gajim 버전의 C 모듈이었다);
  3. C 모듈은 OS X 유휴 시간을 얻습니다 (사용 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:

파이썬을 사용하여 창에서 마우스 클릭 감지

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