Как бы я получить текущие координаты мыши в Bash? - PullRequest
18 голосов
/ 12 декабря 2011

Мне нужно получить текущие координаты мыши в bash, и xdotool не работает для меня. Как бы я это сделал?

Ответы [ 5 ]

35 голосов
/ 17 декабря 2012

Чтобы избежать всех вещей sed / awk / cut, вы можете использовать

xdotool getmouselocation --shell

В частности,

eval $(xdotool getmouselocation --shell)

поместит положение в переменные оболочки X, Y и SCREEN.После этого

echo $X $Y

предоставит фрагмент, готовый для последующего xdotool mousemove или любого другого использования.


Мое дополнительное средство для последовательного нажатия на несколько позиций - это файл position.txt (заданный несколькими прогонами eval / echo):

123 13
423 243
232 989

И код, который его используетis:

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
16 голосов
/ 15 мая 2016

Попробуйте это:

# 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

Этот ^ будет записывать только координаты мыши в координат.txt. Вы можете использовать каждую строку в скрипте, если хотите повторить действия, выполненные во время записи. Простой ctrl+c подойдет для завершения сеанса записи.

Это лишь небольшой пример того, насколько удивительным и практичным может быть xdotool для автоматизации АФК и других вещей. Даже кастомные боты: D

(Изменить)

Если вам нужно убрать x: и y: из команды sed, вы можете добавить логическое ИЛИ |, используя опцию -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.

1 голос
/ 13 декабря 2011

Если вы используете xterm, вы можете выдать escape-последовательность ESC [ ? 9 h, которая заставит xterm отправлять escape-последовательность в управляющую программу (т.е. bash) при щелчке мышью.Я не знаю, имеют ли другие эмуляторы терминала подобную функциональность.

Информация об отслеживании мыши в xterm: http://www.xfree86.org/current/ctlseqs.html#Mouse Отслеживание

1 голос
/ 13 декабря 2011

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"

Множество способовСкин это кот.

1 голос
/ 13 декабря 2011

Что вы имели ввиду под 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

Это могло бы пропустить предупреждение.

Если ваш единственный ввод - это линия положения курсора, то ее передача по 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/*;/}

НТН

...