我正在尝试在视频游戏(如果你想知道的话,我的世界)中制作一个自动点击器(用于农场),即使窗口在后面也能正常工作。我在成功失去窗口焦点后禁用了游戏自动暂停,然后尝试使用
xdotool click --repeat 100000000000 --delay 1000 1 --window $(xdotool search --name --onlyvisible Minecraft)
或者简单地
xdotool click --repeat 100000000000 --delay 1000 1 --window WINDOW_ID
其中WINDOW_ID
是我手动获取的游戏窗口的ID。但这两个命令都完全忽略该--window
选项并充当
xdotool click --repeat 100000000000 --delay 1000 1
即它单击鼠标当前指向的位置。
我是否做错了什么或者是否存在一些我不知道的技术限制?
答案1
问题真的来自 xdotool 吗?
您键入的命令没有任何问题:
选项--window
存在于xdotool click
。
也许问题部分来自于《我的世界》。您尝试过使用其他软件吗?
这就是我所做的。它对我有用:
打开2个终端。让我们称呼他们为1号航站楼和航站楼_2。
(我用 St 和 Guake 做到了,但你可以尝试用其他终端模拟器)。在1号航站楼, 跑步
xev | grep button
。
它将打开一个空白窗口并检查其上是否识别出事件。在航站楼_2,运行
sleep 5 && xdotool getwindowfocus
,
然后快速(不到 5 秒)单击由 所创建的窗口xev
。
你会得到一个号码,我们就打电话吧窗口ID。聚焦航站楼_2再次并确保鼠标光标位于
xev
窗口之外。
之后,运行命令xdotool click --window WINDOW_ID 1
。查看输出1号航站楼。你应该得到类似的东西:
state 0x0, button 1, same_screen YES state 0x100, button 1, same_screen YES
这意味着xev
窗口收到了 xdotool 发送的点击事件,即使它没有聚焦。
我还注意到,如果我从 St(或可能任何终端)向未聚焦的 Guake 发送点击,并将鼠标光标移出 Guake 窗口,除了 Guake 现在聚焦之外,不会发生任何可见的事情。
但它在另一个方向上不起作用(从瓜克到圣,瓜克保持专注)。
你还可以做什么
例如,键盘事件并不真正关心鼠标位置,但某些鼠标事件(包括单击)确实关心:您应该单击“某处”。
在 Xdotool 手册上,xdotool click --window
他们说
Uses the current mouse position when generating the event.
,
所以,也许,如果您的鼠标光标位于您想要单击的窗口之外(假设它是“Minecraft”),则 Minecraft 窗口将忽略该事件。
我看到的最简单的解决方案是:
- 存储当前鼠标位置:
prev_pos=$(xdotool getmouselocation | awk -F "[: ]" '{print $2 " " $4}'
- 转到您要单击的窗口(例如,转到左上角):
xdotool mousemove $(xdotool getwindowgeometry $(xdotool search --name --onlyvisible Minecraft | tail -1) | awk -F "[, ]" 'NR==2{print $4 " " $5}'))
- 单击(可以工作,因为鼠标位于正确的位置):
xdotool click 1
- 返回到之前的鼠标位置:
xdotool mousemove $(echo $prev_pos)
顺便说一句,如果您想多次重复单击,您应该:
- 留在“我的世界”窗口中。
- 每秒切换一次窗口,那么您需要使用 for 循环而不是选项
--repeat 100000000 --delay 1000
。