如何监控系统范围内的用户活动?

时间:2011-08-22 19:01:49

标签: java cocoa events background watch

如何实现某种后台进程,不断(或在短时间内)检查用户是否正在与系统进行交互,即简单明了地使用计算机?显而易见的方法是检查用户生成的任何类型的事件,例如按键,鼠标移动和鼠标点击等。在某个应用程序中捕获事件是很简单的,因为这些事件通常是通过应用程序的事件循环自动提供的,但是如何在系统范围内实现这一点,即无论前端/焦点是什么应用程序?如何优雅地完成,所以这样的过程不会消耗太多的系统资源?

我对此感兴趣,但显然每个平台都有不同的方式 - 跨平台方式(Java)是理想的,但我选择的平台是Mac OS X(Cocoa)。

3 个答案:

答案 0 :(得分:2)

Thomas Langston的想法是检查pidgin(libpurple)如何做到这一点非常有帮助。我下载了源代码,发现了这个 -

在第46行开始的pidgin-2.10.0 / pidgin / gtkidle.c中:

/*
* 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.
*/

该文件包含为不同平台处理此问题的代码。

答案 1 :(得分:1)

我不知道明确的答案,但我知道我要去哪看。 Pidgin和其他开源IM客户端必须知道用户是否空闲。我确信您可以使用类似的方法来确定用户活动。

答案 2 :(得分:1)

捕获像按键或鼠标移动这样的系统事件并不是任何一种语言的领域。这基本上是操作系统管理的内容,并且因为您需要一些必须监听系统范围事件的机制,所以您必须以一种或另一种方式依赖操作系统提供的API。例如,在Windows上,您可以从Java程序中获取可用于侦听系统范围事件的Win API。但这将特定于Win API,因此对于Mac OS,它将是不同版本的API。