【问题标题】:How to monitor user activity, system-wide?如何在系统范围内监控用户活动?
【发布时间】:2011-11-01 09:46:36
【问题描述】:

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

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

【问题讨论】:

  • 显然,我正在寻找的是“系统空闲时间”,它存储在系统级别,可以通过适当的 API/技术读取......
  • detecting keyboard, mouse activity in linux 上的这个问题的 X11(例如 Linux)版本有一个真正的答案,而这个问题没有。

标签: java cocoa events background watch


【解决方案1】:

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

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

【讨论】:

  • 在 Mac OS X(10.4 及更高版本)上,最简单的方法似乎是这个调用:CGEventSourceSecondsSinceLastEventType() developer.apple.com/library/mac/#documentation/Carbon/Reference/…
  • 不! jwz 的两种方法都仅指示屏幕保护程序上次更改状态的时间(2004/09/14 == 1095196626),而不是系统上次看到用户活动的时间。 Pidgin 实际上并没有使用这种方法。相反,它使用 XScreenSaverQueryInfo 作为 Luke Schierer 的 proposed,尽管没有人有(现代)它不起作用的例子,但它却被嘲笑为“非常不稳定”。
【解决方案2】:

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

【讨论】:

  • 好主意! Pidgin 也是跨平台的。
【解决方案3】:

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

【讨论】:

  • 是的……我一直在为这些案例中的至少一个寻找具体的解决方案:)
  • 也许你会发现这很有用 -ubuntuforums.org/archive/index.php/t-864566.html
  • 这比我需要的要复杂,但我相信有一天我会需要这种东西……谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
相关资源
最近更新 更多