Windows, Linux 및 MacOS의 Python에서 디스플레이 유휴 시간을 어떻게 결정하려면 어떻게해야합니까?
문제
사용자가 마지막으로 키를 쳤거나 마우스를 옮겼는지가 얼마나 오래 걸렸는지 알고 싶습니다. 내 응용 프로그램뿐만 아니라 전체 "컴퓨터"(즉, 디스플레이)에서 그들이 여전히 컴퓨터 및 화면에 나타나는 알림을 관찰 할 수 있습니다.
(PY) GTK+에서 순전히이 작업을 수행하고 싶지만 플랫폼 별 기능을 호출 할 수 있습니다. 이상적으로는 이미 파이썬에서 래핑 한 함수를 호출하고 싶지만 불가능하다면 약간의 C 이상이 아닙니다. ctypes
내가 실제로 찾고있는 것을 아는 한 코드.
창에서 내가 원하는 기능은 생각합니다 GetLastInputInfo
, 그러나 그것은 pywin32에 의해 포장되지 않은 것 같습니다. 뭔가 빠졌 으면 좋겠어요.
해결책
Gajim Windows, OS X 및 GNU/Linux (및 기타 *닉스)에서 이런 식으로 수행합니까 :
- 파이썬 래퍼 모듈 (또한 Windows 유휴 시간 감지 코드, 사용
GetTickCount
~와 함께ctypes
); - x11 유휴 시간을 얻는 CTypes 기반 모듈 (사용
XScreenSaverQueryInfo
, 오래된 Gajim 버전의 C 모듈이었다); - 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