我需要在bash中获取当前鼠标坐标,而xdotool对我来说不起作用。我该怎么做?
答案 0 :(得分:33)
为了避免所有sed / awk / cut东西,你可以使用
xdotool getmouselocation --shell
特别是
eval $(xdotool getmouselocation --shell)
会将该位置放入shell变量X
,Y
和SCREEN
。之后,
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"
为这只猫皮肤涂抹的方法很多。