我在由外部条件控制的循环中使用 xdotool(最简单的情况是:ctrl-c)。我的问题是循环速度太快,在循环运行时很难转到终端来控制循环。在以下非常简单的命令行示例中,目标是用手移动驼鹿,并快速重复单击您用手指向的目标:
while true; do xdotool click 1 sleep 0.02; echo -n .; done
当我的终端不是活动窗口时,是否有一种简单而安全的方法(不是黑客手段)让 xdotool 或我的脚本读取鼠标按钮或键盘的真实状态?目前,我只是组织我的窗口,以便我可以在目标窗口外滑动到终端,然后按 ctrl-c,但我希望能够通过右键单击或类似操作来打开/关闭。
答案1
我找到了一种相当简单的方法来实现键盘中断,即使用 python3(它必须以 root 身份运行才能捕获按键)。因此,我将 xdotool 包装在一个 python3 脚本中,该脚本能够在脚本运行的窗口不活动时读取键盘的“状态”。
我确信下面的代码可以修改为停止/继续,而不是直接退出整个过程。但在这个简单的例子中F3键用于停止循环。
这可能适用于 python 2.7(我没有试过,但是下面用pip替换pip3试试),是的在 Ubuntu 16.04 上使用 python3 测试。
首先,你需要安装两个软件:xdotool
和pip3
sudo apt install xdotool pip3
然后你需要安装keyboard
pip 的包
pip3 install keyboard
该脚本如下所示,保存它,使其可执行(chmod +x,这在技术上不是必需的)并使用 sudo 或以 root 用户身份运行它。
#!/usr/bin/python3
import keyboard
import subprocess
import os
def key_press(key):
if key.name == "f3":
os._exit(0)
keyboard.on_press(key_press)
while True:
subprocess.call(['/usr/bin/xdotool', 'click', '1', 'sleep', '0.02'])
我对键盘 API(或 Python)没有完全理解,但据我所知,每次按下一个键时,keyboard.on_press
都会调用一个回调(在本例中是函数)。因此,如果您想更改按下键时发生的情况,请更改 if 语句中的代码。如果您想更改要监听的键,请更改为另一个键。如果您想监听任何按键,只需删除 if 行和下一行的缩进即可。key_press
key_press
f3
请注意底线,其中使用数组来包含 xdotool 的所有参数。如果您想添加更多参数,则必须向数组添加更多字符串,所有参数都必须是字符串。
答案2
呃!??我刚刚发现了怎么做:-o:有一件事可以用 xdotool 检查,那就是鼠标的位置,因此可以检查鼠标是否移动并据此修改脚本行为。