2

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

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

4

3 回答 3

2

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

在 pidgin-2.10.0/pidgin/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.
*/

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

于 2011-08-22T20:29:01.087 回答
1

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

于 2011-08-22T19:07:37.200 回答
1

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

于 2011-08-22T19:19:46.803 回答