私は、ウィンドウが後ろにあっても動作するビデオゲーム(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
。