【问题标题】:detecting keyboard, mouse activity in linux在linux中检测键盘、鼠标活动
【发布时间】:2010-09-18 08:48:18
【问题描述】:

我需要一种方法来检测 Linux 上的鼠标/键盘活动。类似于任何 IM 程序所做的事情。如果在 5 分钟内未检测到任何活动,它会将您的 IM 状态设置为“我现在不在这里”。

对此的任何帮助表示赞赏。

谢谢。

【问题讨论】:

    标签: linux keyboard mouse android-activity


    【解决方案1】:

    尝试在命令行执行who -u -H。它会告诉您谁已登录以及他们空闲了多长时间。至少有用户登录到一个终端;我认为它在 X 中根本不起作用。无论如何,通过这些信息,您可以判断谁处于空闲状态并采取适当的措施。

    如果你在 X 中,你可以创建一个脚本来作为屏幕保护程序或类似的东西运行。

    【讨论】:

    • 当我有机会时,我将不得不看看这个并在我的 linux 机器上运行它。但这看起来很棒。坚持内部命令。 awksed 的 oneliner 可能会完成这项工作。甚至可能是 grep.
    • 您也可以只使用w - 这会打印出分钟和秒,而不是小时和分钟。但它们都只适用于终端(它们不监视 X 中的活动)。
    【解决方案2】:

    当有更好的方法可用时不要轮询。

    您没有指定环境,但由于您提到鼠标,我将假设现代 X11。

    xidle 使用 MIT-SCREEN-SAVER 扩展来判断用户是否空闲——你可以直接使用xidle,或者阅读它的源代码来学习如何自己使用 XScreenSaver(3)。

    编辑

    man 3 XScreenSaver -- 只使用它的空闲报告/通知部分,因为自 X11R6 以来没有更多的XIDLE 扩展。

    【讨论】:

      【解决方案3】:

      我的方法是使用 ad-hoc perl 模块:

      # cpan -i X11::IdleTime; sleep 2; perl -MX11::IdleTime -e 'print GetIdleTime(), $/;'
      

      【讨论】:

      • 如果按命令运行命令,我会收到“无法在 @INC 中找到 X11/IdleTime.pm”消息。
      • 你必须以cpan X11::IdleTime为例安装它
      【解决方案4】:

      完成 解决方案:(将整个代码剪切并粘贴到终端中)

      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 模块)

      【讨论】:

      • 谢谢。对我来说,这正是我正在寻找的解决方案 :)
      • 但是你的编译行是错误的。它必须按此顺序工作,否则链接器会认为不需要这些库,并且如果您将源文件放在它们之后,则会删除它们:gcc idletime.c -o idletime -lX11 -lXext -lXss
      • 作为 X11::IdleTime 模块的作者,我很高兴看到 11 年后人们仍在使用它。
      • 不获取屏幕,大概可以使用DefaultRootWindow(display);节省了几行代码。 Xlib.h 和 Xutil.h 的包含也不应该是必需的; scrnsaver.h 已经把他们拉进来了。
      • @thelsdj 现在已经 18 年了,它仍然很有用。谢谢!
      【解决方案5】:

      或者简单地使用命令xprintidle 以毫秒为单位返回空闲时间。

      它已被打包用于基于 debian 的系统。 (源代码在原始站点 dtek.chalmers.se/~henoch 上不再可用,但您可以通过 packages.ubuntu.com 获取)

      more info on freshmeat.net

      【讨论】:

      • xprintidle 似乎未维护(上游)。 last archive of its web page 是 2011 年,其最新版本 (0.2) 日期为 2008 年。也就是说,Debian version 似乎(有点)得到维护。
      • 部分程序刚完成。
      • 另一种选择是使用python:stackoverflow.com/questions/4855823/…
      • 非常不错的实用程序,但是否有一个仅用于 KEYBOARD 活动?
      • 是的,我也在寻找一种忽略的方法,例如播放视频时。
      【解决方案6】:

      我写了wait-while-idle.rb,它执行“在 linux 中检测键盘、鼠标活动”,但反过来——等到用户回来。

      是的,当然——这是轮询,但我怀疑这里是否有人需要性能。

      打算用它和一些脚本来抓住偷偷溜进我电脑的恶作剧者。

      【讨论】:

      • 您的程序使用 xprintidle。但必须先安装 xprintidle。
      • 是的,确实如此。
      【解决方案7】:

      这是一个如何使用xprintidle 和 shell 脚本检查用户是否空闲 5 分钟的示例:

      #!/bin/sh
      idletime=$(xprintidle)
      threshold=300000 # 5 min = 5 * 60 * 1000 ms
      if [ "$idletime" -gt "$threshold" ]; then
        echo "idle"
      fi
      

      xprintidle 以毫秒为单位返回时间。

      此脚本不进行任何轮询或类似操作。它仅在用户空闲时执行一些代码,否则不执行任何操作。

      【讨论】:

      • @RichieHH 这就是为什么我添加了通知“此脚本不进行任何轮询或类似操作。” )
      猜你喜欢
      • 2011-01-24
      • 1970-01-01
      • 2010-09-25
      • 2011-06-01
      • 1970-01-01
      • 2011-06-09
      • 2017-10-09
      • 2016-09-16
      相关资源
      最近更新 更多