如何在bash中获取当前鼠标坐标?

时间:2011-12-12 19:56:28

标签: bash shell unix mouse

我需要在bash中获取当前鼠标坐标,而xdotool对我来说不起作用。我该怎么做?

5 个答案:

答案 0 :(得分:33)

为了避免所有sed / awk / cut东西,你可以使用

xdotool getmouselocation --shell

特别是

eval $(xdotool getmouselocation --shell)

会将该位置放入shell变量XYSCREEN。之后,

echo $X $Y

会为稍后的xdotool mousemove或任何其他用途提供准备好的代码段。


连续点击几个位置的额外内容是文件positions.txt(由几个eval / echo运行给出):

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

答案 1 :(得分:15)

试试这个:

# 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

这^将鼠标坐标记录到coordinates.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版本中可能无法正常工作。

答案 2 :(得分:1)

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之前)你可以在两行上获得它:

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 positon line,那么将其传递到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

答案 3 :(得分:1)

如果您正在使用xterm,则可以发出一个转义序列ESC [ ? 9 h,当您用鼠标单击时,它将使xterm向控制程序(即bash)发送转义序列。我不知道其他终端仿真器是否具有类似的功能。

xterm中鼠标跟踪的信息位于http://www.xfree86.org/current/ctlseqs.html#Mouse跟踪

答案 4 :(得分:1)

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

所以它适合你。您只需要解析命令的输出。您可以使用上面发布的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"

为这只猫皮肤涂抹的方法很多。