如何在特定窗口输入特定字符串时执行程序?

如何在特定窗口输入特定字符串时执行程序?

我想编写一个 shell 脚本,当在某个应用程序(例如互联网聊天室或短信服务或类似的东西)中输入某些关键词时,使用截图程序 Shutter 自动截图。

本质上,当输入特定字符串时,例如“这是一个美好的一天”,我希望我的 shell 脚本能够截取该特定短语的屏幕截图(而不仅仅是整个屏幕),然后将屏幕截图粘贴到文件夹中。

我该如何编写此脚本、使其自动化并在脚本中使用 Shutter?

答案1

用作logkeys键盘记录器

有几种可用的键盘记录程序,我使用的logkeys是此处存储库中的程序。其基本命令是:

sudo logkeys -s # start logging
sudo logkeys -k # stop logging

默认情况下,logkeys将默认输入设备记录到/var/log/logkeys.log。该程序提供选项来指定要记录的设备、日志文件路径和正在使用的键盘映射,所有这些都可以在man logkeys。 此外github 自述文件提供有用的提示和故障排除帮助。

监控logkeys输出

为了监视键盘记录器的输出文件,我以 root 权限启动 shell,并使用一个简单的while循环来不断grep输入安全词bananayt。如果找到该字符串,echo则覆盖日志文件,从而有效地删除其内容,这样grep就不会两次找到相同的字符串。之后scrot截取屏幕截图并将其保存到例如/home/user/2017-11-08_10:00:00_screenshot.png

while :; do
  grep -q banana /var/log/logkeys.log &&
  (
    echo >/var/log/logkeys.log
    scrot "/home/user/$(date +%F_%T)_screenshot.png"
  )
done

当然,脚本也需要以 root 权限启动。您可以在括号内添加更多命令,或者使用附加grep行添加其他测试,例如

grep -q apple /var/log/logkeys.log && echo "I found an apple!"

测试特定程序是否具有焦点

为了仅在特定程序具有焦点时运行 logkeys,我将使用xdotool以下命令获取焦点窗口的名称:

xdotool getactivewindow getwindowname

综合起来

#!/ind/bash

# The script takes two arguments, the first being the keyword which triggers 
# the below commands and the second being the name of the window to monitor, 
# with support of extended regular expressions.
# Example call: sudo bash /path/to/script "banana" '.*Kate'

sleep_time="1" # sleep time between tests for focused window in seconds
logfile="/var/log/logkeys.log" # path to the keylogger's logfile
logkeys_options="-o $logfile" # options for logkeys
commands(){ # command(s) to run
  scrot "/home/user/$(date +%F_%T)_screenshot.png"
}

while :; do
  # test if a window with the given name is focused
  if [[ "$(xdotool getactivewindow getwindowname)" =~ $2 ]]; then
    # start logkeys if not running
    [ -e /var/run/logkeys.pid ] || logkeys -s $logkeys_options
    # search logfile for given keyword
    grep -q "$1" "$logfile" && ( echo >"$logfile"; commands )
  else
    # stop logkeys if running
    [ -e /var/run/logkeys.pid ] && logkeys -k
  fi
  # sleep for $sleep_time seconds before testing again
  sleep $sleep_time
done

sudo bash /path/to/script "banana" '.*Kate'我建议在一个本身不受监视的终端窗口中启动脚本,这样您就可以安全地使用Ctrl+终止它C

相关内容