Мне нужно получить текущие координаты мыши в bash, а xdotool не работает для меня. Как мне это сделать?
Как получить текущие координаты мыши в bash?
Ответ 1
Чтобы избежать всех файлов 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
И код, который его использует:
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
Ответ 2
Попробуйте это:
# Real time mouse position.
watch -t -n 0.0001 xdotool getmouselocation
Это покажет ваше местоположение мыши на "х" и "у" в режиме реального времени, когда вы перемещаете его. Вы можете сохранить свои координаты в файл для последующей ссылки или использовать в скрипте для автоматизации этих движений мыши следующим образом:
# Save real time mouse coordinates to file.
while true; do xdotool getmouselocation | sed -e 's/ screen:0 window:[^ ]*//g' >> coordinates.txt; done
Этот ^ будет записывать только координаты мыши в файле arguments.txt. Вы можете использовать каждую строку в скрипте, если хотите повторить действия, выполненные во время записи. Простой ctrl+c
сделает для завершения сеанса записи.
Это всего лишь небольшой пример того, насколько удивительным и практичным может быть xdotool
для автоматизации AFK и других вещей. Даже кастомные боты: D
(Редактировать)
Если вам нужно убрать x:
и y:
из команды sed
, вы можете добавить логическое ИЛИ |
, используя -E
для расширенного регулярного выражения, -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.
Ответ 3
Что вы имели в виду под 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, тогда соединение с 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/*;/}
НТН
Ответ 4
Если вы используете xterm, вы можете создать escape-последовательность ESC [ ? 9 h
, которая заставит xterm отправить управляющую программу в управляющую программу (т.е. bash) при щелчке мышью. Я не знаю, имеют ли другие терминальные эмуляторы аналогичную функциональность.
Информация о отслеживании мыши в xterm находится в http://www.xfree86.org/current/ctlseqs.html#Mouse Отслеживание
Ответ 5
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 script 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"
Множество способов скинуть эту кошку.