web-dev-qa-db-ja.com

現在のマウス座標をbashで取得するにはどうすればよいですか?

現在のマウス座標をbashで取得する必要がありますが、xdotoolが機能しません。どうすればいいですか?

20
t3hcakeman

すべてのsed/awk/cutを回避するには、次を使用できます

xdotool getmouselocation --Shell

特に、

eval $(xdotool getmouselocation --Shell)

位置をシェル変数XYおよびSCREENに配置します。その後、

echo $X $Y

後で使えるスニペットを提供しますxdotool mousemoveまたはその他の用途。


いくつかの位置に順次クリックするための私の追加は、positions.txtファイルです(いくつかのeval/echo runによって与えられます):

123 13
423 243
232 989

そしてそれを使うコードは:

while read line; do
     X=`echo $line| cut -c1-3`; 
     Y=`echo $line| cut -c4-7`;
     xdotool mousemove --sync $((  0.5 + $X )) $(( 0.5 + $Y ));
     xdotool click 1
done < positions.txt

ピクセルをスケーリングする必要がない場合(私の場合とは異なり)、それは単純なものである可能性があります

while read line; do
     xdotool mousemove --sync $line;
     xdotool click 1
done < positions.txt
36
Lighty

これを試してください:

_# Real time mouse position.
watch -t -n 0.0001 xdotool getmouselocation 
_

これにより、マウスを移動すると、マウスの位置が「x」と「y」にリアルタイムで表示されます。座標をファイルに保存して後で参照したり、スクリプトで使用してこれらのマウスの動きを次のように自動化したりできます。

_# Save real time mouse coordinates to file.
while true; do xdotool getmouselocation | sed -e 's/ screen:0 window:[^ ]*//g' >> coordinates.txt; done
_

This ^はonlyマウスの座標を座標.txtに記録します。記録中に行われたアクションを繰り返す場合は、スクリプトの各行を使用できます。単純な_ctrl+c_は、記録セッションを終了するために行います。

これは、AFKの自動化やその他の目的でxdotoolがいかに素晴らしく実用的であるかのほんの一部です。カスタムボットでも:D

(編集)

_x:_と_y:_をsedコマンドから削除する必要がある場合は、論理OR _|_を追加できます。拡張正規表現の_-E_オプションを使用して、次のように演算子:

_xdotool getmouselocation | sed -E "s/ screen:0 window:[^ ]*|x:|y://g"_

また、よりコンパクトなコマンドにリダイレクトとコマンド置換を使用する場合は、パイプではなく次のコマンドを使用できます。

sed -E 's/ screen:0 window:[^ ]*|x:|y://g' <<< $(xdotool getmouselocation)

免責事項として、sed正規表現はGNU sedに対して記述されており、異なるプラットフォームやsedバージョンで同じように機能しない場合があります。

18
Yokai

xdotoolが機能しないことの意味は何ですか?

の出力は何ですか

xdotool getmouselocation

とにかく、Cプログラムをコンパイルできる場合: http://dzen.geekmode.org/dwiki/doku.php?id=misc:xget-mouse-position

以下のコメントに関して、あなたはあなたが得たと書いた:

Warning: XTEST extension unavailable on '(null)'. Some functionality may be disabled; See 'man xdotool' for more info. x:654 y:453 screen:0 window:1665

私は(Windows XPの前で)次のような2行で表示されると想定しています。

Warning: XTEST extension unavailable on '(null)'. Some functionality may be disabled; See 'man xdotool' for more info. 
x:654 y:453 screen:0 window:1665

その場合は、STDERRを次のようにリダイレクトする必要があります。

xdotool getmouselocation 2>/dev/null

それは警告をスキップします。

入力がcursos位置行のみの場合、sedにパイプすると、次のような座標が得られます。

xdotool getmouselocation 2>/dev/null | \
sed 's/x:\([0-9]\+\)[ \t]y:\([0-9]\+\)[ \t].*/\1;\2/'
# OUTPUT should by something like:  "654;453"

座標を使用する場合(bashを使用):

export COORDINS=`xdotool getmouselocation 2>/dev/null | sed 's/x:\([0-9]\+\)[ \t]y:\([0-9]\+\)[ \t].*/\1;\2/'`
export XPOS=${COORDINS/;*/}
export YPOS=${COORDINS/*;/}

HTH

1
Zsolt Botykai

I get Warning: XTEST extension unavailable on '(null)'. Some functionality may be disabled; See 'man xdotool' for more info. x:654 y:453 screen:0 window:1665

したがって、IS機能します。コマンドの出力を解析するだけで済みます。上記のsedスクリプトzsoltを使用するか、他のさまざまなオプションを使用できます。

  xdotool getmouselocation 2>/dev/null | cut -d\  -f1,2 -
  // returns something like "x:2931 y:489"

または

  xdotool getmouselocation 2>/dev/null \
   | awk 'BEGIN{RS=" ";ORS=RS} {split($0,a,":");} a[1]~/^[xy]$/{print a[2];}'
  // returns something like "2931 489 "

または

  xdotool getmouselocation 2>/dev/null | sed 's/ sc.*//; s/.://g; s/ /x/'
  // returns something like "2931x489"

この猫の皮をむく方法はたくさんあります。

1
ghoti

Xtermを使用している場合、エスケープシーケンスESC [ ? 9 hを発行すると、マウスでクリックしたときにxtermが制御プログラム(bashなど)にエスケープシーケンスを送信します。他の端末エミュレータに同様の機能があるかどうかはわかりません。

Xtermでのマウス追跡に関する情報は http://www.xfree86.org/current/ctlseqs.html#Mouse Trackingにあります

1
evil otto