无法让 --window 选项与 xdotool click 一起使用

无法让 --window 选项与 xdotool click 一起使用

我正在尝试在视频游戏(如果你想知道的话,我的世界)中制作一个自动点击器(用于农场),即使窗口在后面也能正常工作。我在成功失去窗口焦点后禁用了游戏自动暂停,然后尝试使用

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

相关内容