2011-08-22 3 views
2

사용자가 시스템과 상호 작용하는지 (즉, 간단하고 간단하게) 컴퓨터를 사용하여 지속적으로 (또는 짧은 간격으로) 확인하는 일종의 백그라운드 프로세스를 구현하는 방법은 무엇입니까? 분명한 방법은 키 누르기, 마우스 이동 및 마우스 클릭 등과 같은 사용자 생성 이벤트를 확인하는 것입니다. 특정 이벤트가 이벤트 루프를 통해 자동으로 제공되기 때문에 일정한 이벤트를 캡처하는 것은 간단합니다. 그러나 어떤 이벤트가 진행중인지, 어떤 이벤트가 진행중인지에 상관없이 이벤트를 어떻게 처리 할 수 ​​있습니까? 어떻게 우아하게 처리 할 수 ​​있습니까? 그런 프로세스가 너무 많은 시스템 자원을 소비하지 않습니까?시스템 전체에서 사용자 활동을 모니터링하는 방법은 무엇입니까?

일반적으로이 기능에 관심이 있습니다.하지만 각 플랫폼마다 다른 방법이 있습니다. Java (Java)는 이상적이지만 Mac OS X (Cocoa) 플랫폼이 좋습니다.

+0

필자가 찾고있는 것은 "시스템 유휴 시간"입니다. 시스템 레벨에 저장되어 있으며 적절한 API/기법을 통해 읽을 수 있습니다. –

+0

** X11 ** (예 : Linux) 버전 질문 [키보드에서 키보드 감지, 마우스 활동] (https://stackoverflow.com/questions/222606/detecting-keyboard-mouse-activity-in-linux)의 질문에 대한 답변이 진짜입니다. –

답변

1

나는 명백한 답을 모른다. 그러나 나는 어디를 가야할지 안다. Pidgin과 다른 오픈 소스 IM 클라이언트는 사용자가 유휴 상태인지 여부를 알아야합니다. 비슷한 방법을 사용하여 사용자 활동을 확인할 수도 있습니다.

+0

좋은 아이디어! 피진은 크로스 플랫폼이기도합니다. –

1

키 누르기 나 마우스 움직임과 같은 시스템 이벤트를 캡처하는 것은 그와 같은 언어의 영역이 아닙니다. 이것은 기본적으로 OS가 관리하는 것이며, 시스템 전반의 이벤트를 수신해야하는 메커니즘이 필요하기 때문에 OS 제공 API에 의존해야합니다. 예를 들어, Windows에서는 Java 프로그램 내에서 시스템 전체 이벤트를 수신하는 데 사용할 수있는 Win API를 얻게됩니다. 그러나 이것은 Win API에만 해당되므로 Mac OS의 경우 다른 버전의 API가됩니다.

+0

예 ... 적어도 하나의 사례에 대해 구체적인 해결책을 찾고있었습니다. –

+1

아마도이 유용한 정보를 찾을 수 있습니다 .http : //ubuntuforums.org/archive/index.php/t-864566.html – Bhaskar

+0

그 이상입니다. 내 목적을 위해 필요한 것보다 복잡하지만 언젠가는 이런 종류의 것이 필요할 것이라고 확신합니다 :) 감사합니다. –

2

pidgin (libpurple)이 어떻게 작동하는지 토마스 랭 스턴 (Thomas Langston)이 생각한 아이디어는 매우 유용했습니다. 나는 소스 코드를 다운로드하고이 발견 -

피진-2.10.0/피진/gtkidle.c에서

라인 (46)에 시작 : 파일이 다른 플랫폼이 처리하는 코드를 포함하는

/* 
* Get the number of seconds the user has been idle. In Unix-world 
* this is based on the X Windows usage. In MS Windows this is 
* based on keyboard/mouse usage information obtained from the OS. 
* In MacOS X, this is based on keyboard/mouse usage information 
* obtained from the OS, if configure detected IOKit. Otherwise, 
* MacOS X is handled as a case of X Windows. 
* 
* In Debian bug #271639, jwz says: 
* 
* Purple should simply ask xscreensaver how long the user has been idle: 
* % xscreensaver-command -time 
* XScreenSaver 4.18: screen blanked since Tue Sep 14 14:10:45 2004 
* 
* Or you can monitor the _SCREENSAVER_STATUS property on root window #0. 
* Element 0 is the status (0, BLANK, LOCK), element 1 is the time_t since 
* the last state change, and subsequent elements are which hack is running 
* on the various screens: 
* % xprop -f _SCREENSAVER_STATUS 32ac -root _SCREENSAVER_STATUS 
* _SCREENSAVER_STATUS(INTEGER) = BLANK, 1095196626, 10, 237 
* 
* See watch() in xscreensaver/driver/xscreensaver-command.c. 
* 
* @return The number of seconds the user has been idle. 
*/ 

.

+0

Mac OS X (10.4 이상)에서 가장 쉬운 방법은 다음과 같습니다 : CGEventSourceSecondsSinceLastEventType() http://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventSourceSecondsSinceLastEventType –

+0

** Nope! ** Both jwz의 방법은 화면 보호기가 마지막으로 상태를 변경 한 시점 (2004/09/14 == 1095196626)이 아니라 시스템이 마지막으로 사용자 행동을 보았을 때를 나타냅니다 ivity. _Pidgin은 실제로이 메소드를 사용하지 않습니다 _. 대신 [XScreenSaverQueryInfo] (http://linux.die.net/man/3/xscreensaverqueryinfo)를 [제안] (https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=271639)로 사용합니다. # 20) Luke Schierer는 아무도 (현대) 예제가 작동하지 않더라도 "극단적 인 벗겨짐"이라고 불렀다. –

관련 문제