2011-08-22 29 views
2

如何實現一種不斷(或短時間間隔)檢查用戶是否與系統交互的後臺進程,即簡單而簡單地使用計算機?顯而易見的方法是檢查用戶生成的任何類型的事件,如按鍵,鼠標移動和鼠標點擊等。在特定應用程序中捕獲事件是很直接的,因爲這些事件通常是通過應用程序的事件循環自動提供的,但是如何實現這個系統範圍內的事務,即不管前面/關注哪個應用程序?這是如何優雅地完成的,所以這樣的過程不會消耗太多的系統資源?我很感興趣,但顯然每種平臺都有不同的方式 - 跨平臺的方式(Java)是理想的,但我選擇的平臺是Mac OS X(Cocoa)。如何在系統範圍內監視用戶活動?

+0

顯然,我在尋找的是「系統空閒時間」,這是存儲在系統級別的東西,可以通過適當的API /技術讀取...... –

+0

這個** X11 **(例如Linux)版本問題在[檢測鍵盤,鼠標活動在Linux](https://stackoverflow.com/questions/222606/detecting-keyboard-mouse-activity-in-linux)有一個真正的答案,而這個問題沒有。 –

回答

1

我不知道明確的答案,但我知道我會去哪裏看。 Pidgin和其他開源IM客戶端必須知道用戶是否閒置。我相信你可以使用類似的方法來確定用戶活動。

+0

好主意! Pidgin也是跨平臺的。 –

1

捕獲像按鍵或鼠標移動這樣的系統事件並不是任何一種語言的境界。這基本上是操作系統管理的內容,因爲您需要一些必須監聽系統範圍事件的機制,您必須以某種方式依賴操作系統提供的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)是如何做到這一點非常有幫助的。我下載的源代碼,並發現這一點 -

在洋涇浜-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),盧克Schierer,即使沒有人(現代)沒有工作的例子,他們嗤之以鼻,「極其脆弱」。 –