Відповіді:
xdotool
відкриває розташування вказівника ( xdotool getmouselocation
), а останні версії (починаючи з 2.20110530.1) вказують, яке вікно також знаходиться в цьому місці . Жоден з xwininfo
, wmctrl
або більш ранні версії xdotool
з'являються не мати спосіб , щоб відповідати вікно на позицію екрану , де це видно.
Основним викликом X бібліотеки є XQueryPointer
(відповідає QueryPointer
повідомлення). Ось простий скрипт обгортки Python навколо цього дзвінка (за допомогою ctypes
). Помилка перевірки значною мірою опущена. Припускаємо, що ви використовуєте екран 0 (якщо ви не знали, що на дисплеях може бути більше одного екрана, ігноруйте це).
#! /usr/bin/env python
import sys
from ctypes import *
Xlib = CDLL("libX11.so.6")
display = Xlib.XOpenDisplay(None)
if display == 0: sys.exit(2)
w = Xlib.XRootWindow(display, c_int(0))
(root_id, child_id) = (c_uint32(), c_uint32())
(root_x, root_y, win_x, win_y) = (c_int(), c_int(), c_int(), c_int())
mask = c_uint()
ret = Xlib.XQueryPointer(display, c_uint32(w), byref(root_id), byref(child_id),
byref(root_x), byref(root_y),
byref(win_x), byref(win_y), byref(mask))
if ret == 0: sys.exit(1)
print child_id.value
Приклад використання:
xwininfo -tree -id $(XQueryPointer)
$(XQueryPointer)
на 0
, і виклик xwininfo -root
для цього умови усуває цієї примхи .. Спасибо ..
root_id.value
якщо child_id.value == 0
.
if child_id.value == 0: print root_id.value
else: print child_id.value
:)
sed /x[0-9]\\++/q\;d <(xwininfo -tree -id $(XQueryPointer))
xwininfo
Команда дає цей вид продукції, але ви повинні натиснути на вікно , яке потрібно інформація про:
% xwininfo
xwininfo: Please select the window about which you
would like information by clicking the
mouse in that window.
xwininfo: Window id: 0xa0000d "flask"
...
Так робити: xwininfo | grep 'Window id:'
може дати вам щось, з чого можна розібрати ідентифікатор.
xwinfo |grep window id:' &
та дотримуючись його, його можна зробити неінтерактивним xdotool click 1
... але це ризикує click
виконати передній план перед xdotool
схопленням миші. Я б Rathen не використовувати номінальну `сон п, так що, хоча ця відповідь на трасі, я буду чекати wihile , щоб побачити , якщо що - то більш рядний повертає вгору ...
спробуйте це, він використовує лише xdotool, але його версія принаймні "2.20110530.1"
xdotool getmouselocation --shell | grep WINDOW
щоб отримати ідентифікатор вікна безпосередньо, ви можете скористатися цим:
sedGetValue='s/.*=\(.*\)/\1/'
windowId=`xdotool getmouselocation --shell 2>/dev/null |grep WINDOW |sed "$sedGetValue"`
echo $windowId
xdotool getmouselocation --shell | grep WINDOW | awk -F "=" '{print $2}'
xdotool досить хороший для цього.
Біжи xdotool getactivewindow
і ви побачите результат (int) У вікні може бути будь-який монітор. Просто прочитайте, де знаходиться вказівник x11, який очікує натискання :), і незалежно від того, чи це віддалене вікно, vncserver або 3-й робочий стіл середовища куба. Просто працює.
Ви можете грати в режим сну для кращого тестування sleep 3; xdotool click 1+2; xdotool getactivewindow
.
Я бачу, що getwindowsfocus
повертає те саме значення, що іgetactivewindow
.
Якщо ви робите клацання вручну, ви побачите контекстне меню, але натисніть кнопку 1 + 2, натиснувши на обидва кліки, натисніть на поточне місце миші та отримаєте потрібний ідентифікатор.
Спробуй це :)
Якщо у вас є доступ до python-xlib , ось коротший і більш пітонічний еквівалент відповіді Жиля:
from Xlib.display import Display
display = Display()
window = display.screen().root
result = window.query_pointer()
print(result.child.id)
Я розігрувався з відповіддю від Peter.O і придумав:
xdotool click 1|xwininfo|grep 'Window id:'
ArchWiki має хорошу відповідь на це:
activeWinLine=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)")
activeWinId=${activeWinLine:40}
Використовуючи це, sed
ви можете зробити це в одному рядку, що, мабуть, найбільш читабельний спосіб зробити це:
activeWin="$(xprop -root | sed -n 's/^_NET_ACTIVE_WINDOW(WINDOW): window id # //p')"
Зауважте, що xdotool
в моєму Debian мінімум X11 не xprop
було, поки він був включений (аналогічноsed
звичайно).
Якщо ви не хочете роздрібнюватись sed
і grep
не можете робити перетворення тексту цілком у bash
, що, можливо, є трохи більш безпечним у випадку, якщо вихід xprop
трохи зміниться:
activeWin="$(xprop -root)"
activeWin="${activeWin#*_NET_ACTIVE_WINDOW(WINDOW):}'
activeWin="${activeWin%%?_NET_*}'
activeWin="${activeWin##* }'
У всякому разі, це все ще дивний спосіб архівувати таке просте завдання.
xprop -root 2>/dev/null | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* // p'
xdotool getwindowsfocus
з консолі та переміщення миші. Значення буде таким самим, поки ви не натиснете клавішу миші або взаємодієте з клавіатурою (alt + вкладка тощо)
xdotool click 1
методом, згаданим у коментарі до відповіді Брюса Едігера . Ненульовий ідентифікатор робочого столу дійсний, оскільки він повертає відповідне зображення черезimport -window $nonzeroID screen.png
.... Чи є кілька простих налаштувань для сценарію python, щоб повернути це значення для робочого столу ?