【问题标题】:Capturing Keypresses from the Background从后台捕获按键
【发布时间】:2019-10-29 07:37:08
【问题描述】:

我正在尝试编写一个 bash 脚本来监视键盘的特定按键,并在检测到它们时运行命令。我目前可以使用输入命令执行此操作,但前提是运行它的终端位于前台。当窗口不在焦点时,我需要让它工作。

我已经研究过使用 xinput test-xi2 --root 来获取每个事件,这似乎工作得很好,但我不确定如何有效地将输入转换为对我有用的键定义。

这是我目前的程序:

while true; do
    read -rsn1 input
    if [ "$input" = "a" ];
    then
        #Do Something
    fi
done

上面的代码有效,但只在前台。

任何帮助将不胜感激!

【问题讨论】:

  • 您的意思是无论前台是什么应用程序,您都希望能够捕获字母“a”?甚至是 GUI 应用程序?我认为这不能通过在后台运行的 bash 脚本来完成。做一些关于键盘记录器的研究。可以使用expect 完成,但仅适用于单个 shell 进程。

标签: bash input keypress xinput


【解决方案1】:

在做了很多乱七八糟的事情之后,我能够通过使用 xinput 观察我的键盘来让它工作。每当键盘上发生事件时,它都会抛出一个 keyPressed 消息,然后是一个 keyReleased 消息。如果它是一个释放的键,我将它们通过管道传递到 grep 以获取消息,然后将其传递到一个循环中。在循环内部,我将行缩小到仅包含关键信息的行,然后使用 sed 删除多余的信息。这给我留下了可以转换为字符的密钥代码,尽管我只是使用数字。这是我的代码:

xinput test-xi2 --root 3 | grep -A2 --line-buffered RawKeyRelease | while read -r line;
do
    if [[ $line == *"detail"* ]];
    then
        key=$( echo $line | sed "s/[^0-9]*//g")

    #Do something with the key

done

希望这对某人有所帮助!

【讨论】:

  • 以上所有内容都可以替换为:xinput test-xi2 --root 3 | gawk '/RawKeyRelease/ {getline; getline; print $2; fflush()}' | while read -r key; do echo "$key"; done,这样可以在每条匹配的行上节省生成sed,并消除if。如果您的 AWK 是 mawk,则需要 -W interactive 选项。
猜你喜欢
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 1970-01-01
相关资源
最近更新 更多