【发布时间】:2010-09-18 08:48:18
【问题描述】:
我需要一种方法来检测 Linux 上的鼠标/键盘活动。类似于任何 IM 程序所做的事情。如果在 5 分钟内未检测到任何活动,它会将您的 IM 状态设置为“我现在不在这里”。
对此的任何帮助表示赞赏。
谢谢。
【问题讨论】:
标签: linux keyboard mouse android-activity
我需要一种方法来检测 Linux 上的鼠标/键盘活动。类似于任何 IM 程序所做的事情。如果在 5 分钟内未检测到任何活动,它会将您的 IM 状态设置为“我现在不在这里”。
对此的任何帮助表示赞赏。
谢谢。
【问题讨论】:
标签: linux keyboard mouse android-activity
尝试在命令行执行who -u -H。它会告诉您谁已登录以及他们空闲了多长时间。至少有用户登录到一个终端;我认为它在 X 中根本不起作用。无论如何,通过这些信息,您可以判断谁处于空闲状态并采取适当的措施。
如果你在 X 中,你可以创建一个脚本来作为屏幕保护程序或类似的东西运行。
【讨论】:
w - 这会打印出分钟和秒,而不是小时和分钟。但它们都只适用于终端(它们不监视 X 中的活动)。
当有更好的方法可用时不要轮询。
您没有指定环境,但由于您提到鼠标,我将假设现代 X11。
xidle 使用 MIT-SCREEN-SAVER 扩展来判断用户是否空闲——你可以直接使用xidle,或者阅读它的源代码来学习如何自己使用 XScreenSaver(3)。
man 3 XScreenSaver -- 只使用它的空闲报告/通知部分,因为自 X11R6 以来没有更多的XIDLE 扩展。
【讨论】:
我的方法是使用 ad-hoc perl 模块:
# cpan -i X11::IdleTime; sleep 2; perl -MX11::IdleTime -e 'print GetIdleTime(), $/;'
【讨论】:
cpan X11::IdleTime为例安装它
完成c 解决方案:(将整个代码剪切并粘贴到终端中)
cat>/tmp/idletime.c<<EOF
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/extensions/scrnsaver.h>
int GetIdleTime () {
time_t idle_time;
static XScreenSaverInfo *mit_info;
Display *display;
int screen;
mit_info = XScreenSaverAllocInfo();
if((display=XOpenDisplay(NULL)) == NULL) { return(-1); }
screen = DefaultScreen(display);
XScreenSaverQueryInfo(display, RootWindow(display,screen), mit_info);
idle_time = (mit_info->idle) / 1000;
XFree(mit_info);
XCloseDisplay(display);
return idle_time;
}
int main() {
printf("%d\n", GetIdleTime());
return 0;
}
EOF
gcc -Wall /tmp/idletime.c -o /tmp/idletime -L/usr/X11R6/lib/ -lX11 -lXext -lXss
DISPLAY=:0 /tmp/idletime
(主要部分来自 X11::IdleTime perl 模块)
【讨论】:
DefaultRootWindow(display);节省了几行代码。 Xlib.h 和 Xutil.h 的包含也不应该是必需的; scrnsaver.h 已经把他们拉进来了。
或者简单地使用命令xprintidle 以毫秒为单位返回空闲时间。
它已被打包用于基于 debian 的系统。 (源代码在原始站点 dtek.chalmers.se/~henoch 上不再可用,但您可以通过 packages.ubuntu.com 获取)
【讨论】:
xprintidle 似乎未维护(上游)。 last archive of its web page 是 2011 年,其最新版本 (0.2) 日期为 2008 年。也就是说,Debian version 似乎(有点)得到维护。
我写了wait-while-idle.rb,它执行“在 linux 中检测键盘、鼠标活动”,但反过来——等到用户回来。
是的,当然——这是轮询,但我怀疑这里是否有人需要性能。
打算用它和一些脚本来抓住偷偷溜进我电脑的恶作剧者。
【讨论】:
这是一个如何使用xprintidle 和 shell 脚本检查用户是否空闲 5 分钟的示例:
#!/bin/sh
idletime=$(xprintidle)
threshold=300000 # 5 min = 5 * 60 * 1000 ms
if [ "$idletime" -gt "$threshold" ]; then
echo "idle"
fi
xprintidle 以毫秒为单位返回时间。
此脚本不进行任何轮询或类似操作。它仅在用户空闲时执行一些代码,否则不执行任何操作。
【讨论】: