xdotool クリックで動作する --window オプションを取得できません

xdotool クリックで動作する --window オプションを取得できません

私は、ウィンドウが後ろにあっても動作するビデオゲーム(Minecraft)で自動クリックデバイス(農業用)を作成しようとしています。ウィンドウフォーカスを正常に失った後、ゲームの自動一時停止を無効にしてから、次のように試しました。

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
おそらく、問題の一部がMinecraftから来たかもしれません。別のソフトウェアを試してみましたか?

これが私がすることです。それは私のために働きます:

  • 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にフォーカスがあることを除いて、何も起こらないことがわかりました。
しかし、他の方向では機能しません(guacからsaintへ、guacは集中し続けます)。

あなたは他の何かをすることができます。

たとえば、キーボードイベントは実際にはマウスの位置に興味がありませんが、いくつかのマウスイベント(クリックを含む)は重要です。つまり、「どこか」をクリックする必要があります。

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)

ただし、クリックを数回繰り返すには、次の手順を実行する必要があります。

  • Minecraftウィンドウに滞在します。
  • 毎秒ウィンドウを切り替える場合は、optionsの代わりにforループを使用する必要があります
    --repeat 100000000 --delay 1000

関連情報